2009-07-03 41 views
10

Tôi cần lấy số tham số mà một khối đã cho. Ví dụ:Lấy số tham số khối

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 

Điều này có thể trong 1,9 thân cây, nhưng không có trong bất kỳ bản phát hành chính thức nào. Tôi đã hy vọng nếu có bất kỳ cách nào để làm điều này mà không cần phải tải về một mô-đun đá quý/mở rộng riêng biệt.

Trả lời

29

Khi bạn thực hiện một khối với &, nó trở thành đối tượng Proc, có phương thức arity. Chỉ cần cẩn thận - nó trả về phần bổ sung của một người nếu proc lấy một * splat arg.

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

(. Trả lời thông qua "The Ruby Programming Language" book)

+1

bạn đánh tôi với nó :) +1 – Gishu

+6

Phải. Lưu ý rằng '{|| nil} 'sẽ có một số nguyên là 0, nhưng' {nil} 'sẽ có một số nguyên là -1. –

+0

Xin chào Justin, cảm ơn câu trả lời, đây chính xác là những gì tôi cần :) – Exponent

8

Đây có phải là những gì bạn đang tìm kiếm ...

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 
} 

Đầu ra:

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 

Xem thêm - A Ruby HOWTO: Writing A Method That Uses Code Blocks từ codahale.com

+0

Hi Gishu. Cảm ơn bài viết, tôi chắc chắn sẽ cần phải đọc qua điều này. – Exponent

Các vấn đề liên quan