Использование блоков ruby ​​с вызовами методов - PullRequest
0 голосов
/ 12 июня 2011

Следующий код работает отлично.

@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 ]

5 голосов
/ 12 июня 2011

Вы звоните resolve_link с блоком, но не передаете этот блок до open. Попробуйте вместо этого:

def resolve_link(link, &block)
  begin
    return open(link, &block)
  #...
1 голос
/ 12 июня 2011

Вы должны использовать yield, чтобы вызвать блок.

См. Этот ответ для очень простого примера:

Блоки и выходы в рубине

Так что-то вроде

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

Должно работать.

...