2011-06-12 4 views
0

다음 코드는 완벽하게 작동합니다.메서드 호출시 루비 블록 사용

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

는하지만

@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 

(예 @doc는 임시 파일 객체가 아닌 Hpricot을 문서 객체 임) Hpricot을 블록으로 잘 작동하지 않는 것 다음 코드를 사용하려면 어떻게 코드의 두 번째 버전을 사용할 수 있습니까?

+0

질문과 관련이 없지만'def'의 즉각적인 환경에서'rescue'를 떠나는'begin'과'end'를 생략 할 수 있습니다. – sawa

+0

@sawa : OTOH,'begin'은 여러분이 약간의 예외 처리를하려고하는 멋진 시각적 표시이며 독자는주의를 기울여야합니다. –

+0

@mu는 너무 짧아서 보통'def '와 같은 들여 쓰기 수준과 그에 상응하는'end'에서'rescue'를 가져옵니다. 그래서'rescue'가 충분합니다. '구조 (rescue) '를 만날 때마다, 오류가 발생했을 때 그 이상의 것을 말할 수 있습니다. – sawa

답변

5

차단과 함께 resolve_link을 호출 중이지만 그 차단을 open으로 전달하고 있지 않습니다. 대신 다음을 시도하십시오 :

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

블록을 호출하려면 yield을 사용해야합니다.

은 아주 간단한 예를 들어이 답변을 참조하십시오 : 선

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

함께

Blocks and yields in Ruby

그래서 뭔가 작동합니다.

관련 문제