使用方法调用的ruby块

时间:2011-06-12 05:44:07

标签: ruby block hpricot

以下代码完美无缺。

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

但是我想使用下面的代码,它似乎与Hpricot块不相符(例如@doc是一个TempFile对象,而不是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

知道如何让代码的第二个版本工作吗?

2 个答案:

答案 0 :(得分:5)

您正在使用某个块调用resolve_link但是您没有将该块传递给open。试试这个:

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

答案 1 :(得分:1)

您必须使用yield来调用阻止。

有一个非常简单的例子,请参阅这个答案:

Blocks and yields in Ruby

这样的话

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

应该工作。