2013-07-23 2 views
4

Proc 내에서 블록을 생성 할 수 있습니까?Proc 안에서 블록을 평가할 수 있습니까?

a = Proc.new do 
    yield 
end 

a.call do 
    puts "x" 
end 

는 내가 달성하기 위해 노력하고있어 x을 인쇄하는 것입니다,하지만 루비 2.0이 해석하는 것은 LocalJumpError: no block given (yield)을 제기 :이 예를 생각해 보자.

답변

4

작성한 Proc가 독립적 인 yield이기 때문에 불가능합니다. 즉, 문맥에 블록이없는 yield입니다. 지정된 매개 변수를 사용하여 procs를 호출 할 수 있기 때문에 매개 변수를 proc로 전달할 수 있지만 yield은 지정된 매개 변수를 기반으로 작동하지 않습니다. proc의 클로저 안에서 발견 된 블록을 실행한다. 그리고 proc의 클로저는 미리 정의되어 있습니다. 나중에 블록으로 호출하기 때문에 수정되지 않습니다.

irb (메서드 정의가 아님)에 'yield'를 입력하면 LocalJumpError: no block given (yield) 오류가 반환됩니다.

4

@Rebitzele는 코드가 작동하지 않는 이유를 설명했다 다음 yield 키워드는 메서드에 전달 된 익명의 블록을 호출하기위한 속기 표기법, 거기이 경우 심지어 방법 없습니다.

하지만 당신은 물론 블록에 이름을 지정하고 다음 다른 호출 객체를 호출하는 것처럼 호출 할 수 있습니다 : 아직도

a = ->&block { block.() } 

a.() do puts 'x' end 
# x 
+0

여기에 무슨 일이 일어나고 있는지 알아 내려고 노력을하지만,이하지 않는 것 나를 위해 일한다 :'obj.instance_eval {def wrap (& block); a = - & 블록 {block.()}; a.() {puts 'goodbye'}; 종료}; obj.wrap {puts 'hello'; yield}'는'goodbye' 만 출력 할 것입니다. –