2011-06-12 33 views
0

以下代碼完美地工作。使用方法調用的紅寶石塊

@doc = open(link) { |f| Hpricot(f) } 

但我想使用下面的代碼,這似乎並不與角度來說,Hpricot塊發揮出色(如@doc是一個臨時文件的對象,而不是一個角度來說,Hpricot文檔對象)

@doc = resolve_link(link) { |f| Hpricot(f) } 

def resolve_link(link) 
    begin 
    return open(link) 
    rescue 
    logger.debug("#{$!} for link #{link}") 
    raise Exceptions::ErrorResolvingLink.new("Cannot resolve link #{link}.") 
    end 
end 

任何想法如何讓第二版的代碼工作?

+0

與問題無關,但你可以省略'begin'和'end'在'def'的直接環境中離開'rescue'。 – sawa 2011-06-12 07:45:03

+0

@sawa:OTOH,'begin'是一個很好的可視化標記,您即將進行一些異常處理,讀者應該注意。 – 2011-06-12 07:48:32

+0

@mu太短我通常會在與'def'和它相應的'end'相同的縮進級別上帶上'rescue',所以'rescue'就足夠了。每當遇到「救援」時,你都可以知道,除了錯誤之外,任何事情都是錯誤的。 – sawa 2011-06-12 07:54:37

回答

5

你打電話給resolve_link加上一個塊,但是你沒有把這個塊傳遞給open。試試這個:

def resolve_link(link, &block) 
    begin 
    return open(link, &block) 
    #... 
1

您必須使用yield來調用該塊。

看到這個答案很簡單的例子:

Blocks and yields in Ruby

因此,一些沿線

def resolve_link(link) 
    ... 
    yield (some_value_to_pass_to_the_block) 
    ... 
end 

應該工作。