2009-11-25 2 views

답변

9

한 번에 하나의 블록 만 전달할 수 있지만 블록은 실제로 Proc 인스턴스이며 매개 변수로 원하는만큼 인스턴스를 전달할 수 있습니다.

def mymethod(proc1, proc2, &block) 
    proc1.call 
    yield if block_given? 
    proc2.call 
end 

mymethod(Proc.new {}, Proc.new {}) do 
    # ... 
end 

그러나 거의 의미가 없습니다.

+1

블록은 정확히 procs가 아닙니다. 그것들은 일반적인 사용법과 문법을 가지고 있지만, 혼란스러운 행동을 야기하기에 충분한 구현의 차이점이 있습니다. 약간은 현학적인데, 그 범위를 정하는 차이는 전에 조금은 있습니다. – fengb

+0

@fengb 방금 테스트를했습니다. http://gist.github.com/242746 Proc와 블록의 차이점에 대한 더 많은 문서가 있습니까? Ruby는 블록이 Proc임을 알려줍니다. –

+0

블록은 & var 구문을 사용하여 proc에 암시 적으로 "유형 캐스팅"됩니다. 그러나 블록 대 프로 시저로 사용될 때 다르게 동작하는 특정 작업이 있습니다. 장황하지만 포괄적 인 비교 : http://innig.net/software/ruby/closures-in-ruby.rb – fengb

1

구문 상, yield 문을 사용하면 함수에 전달되는 코드 블록 하나만 지원됩니다.

물론 yield을 사용하지 않고 다른 여러 함수 또는 "코드 블록 개체"(Proc 개체)의 함수를 전달하여 사용할 수 있습니다.

1

Proc 개체를 만들고 원하는만큼 많이 전달할 수 있습니다.

Ruby가 가지고있는 블록 및 클로저와 유사한 모든 구성의 미묘함을 이해하려면 this page을 읽기를 권장합니다.

1

당신은 전달 된 두 개의 블록을 처리하기 위해 수율보다는 call 방법을 사용할 수 있습니다

을 방법은 다음과 같습니다.

def mood(state, happy, sad) 
    if (state== :happy) 
    happy.call 
    else 
    sad.call 
    end 
end 

mood(:happy, Proc.new {puts 'yay!'} , Proc.new {puts 'boo!'}) 
mood(:sad, Proc.new {puts 'yay!'} , Proc.new {puts 'boo!'}) 

당신은 예를 들어으로 인수를 전달할 수 있습니다

happy.call('very much') 

논쟁은 블록처럼 예상대로 작동합니다.

Proc.new {|amount| puts "yay #{amount} !"} 
관련 문제