2009-07-03 3 views
10

주어진 블록에 필요한 매개 변수 수를 얻어야합니다. 예 :블록 매개 변수 수 얻기

foobar(1,2,3) { |a, b, c| 
} 

def foobar(x, y, z, &block) 
    # need to obtain number of arguments in block 
    # which would be 3 in this example 
end 

이것은 1.9 트렁크에서 가능하지만 공식 릴리스에서는 불가능합니다. 별도의 gem/extension 모듈을 다운로드하지 않고도이 작업을 수행 할 수있는 방법이 있다면 기대하고있었습니다.

답변

29

&으로 블록을 구체화하면 arity 메서드를 갖는 Proc 개체가됩니다. 주의 할 점 - proc이 * splat arg를 취하는 경우에는 하나의 보수를 반환합니다.

def foobar(x, y, z, &block) 
    p block.arity 
end 

(. "루비 프로그래밍 언어"책을 통해 답변)

+1

당신이 나를 때려 :) +1 – Gishu

+6

오른쪽. '{|| nil}'은 0의 값을 갖지만'{nil} '은 -1의 값을 갖습니다. –

+0

안녕 저스틴, 대답 주셔서 감사합니다, 이것은 정확하게 내가 필요합니다 :) – Exponent

8

을이 당신을 위해 ...

def foobar(x, y, z, &block) 
    # need to obtain number of arguments in block 
    # which would be 3 in this example 
    case block.arity 
    when 0 
     yield "i have nothing" 
    when 1 
     yield "I got ONE block arg" 
    when 2 
     yield "I got TWO block args" 
    when 3 
     yield "I got THREE block args" 
    end 
end 

foobar(1,2,3) { |a, b, c| 
    puts a 
} 

출력 찾고있는 무엇인가 :

D:\ruby\bin>ruby -v 
ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32] 

D:\ruby\bin>ruby c:\Temp.rb 
I got THREE block args 

참조 - codahale.com의 A Ruby HOWTO: Writing A Method That Uses Code Blocks

+0

안녕 Gishu. 이 기사를 읽어 주셔서 감사 드리며, 꼭 읽어보아야 할 것입니다. – Exponent