2013-07-11 36 views
12

Sử dụng irb, chúng tôi có thể liệt kê các phương pháp cho đối tượng cụ thể bằng cách làm như sau:Có cách nào để biết có bao nhiêu thông số cần thiết cho một phương pháp?

"Name".methods 

Nhưng nếu tôi muốn biết có bao nhiêu thông số cần thiết cho một phương pháp đặc biệt, làm thế nào tôi có thể đạt được điều này? Tôi có nghĩa là có cách nào (bằng cách nhấn một số lệnh trên irb), chúng tôi có thể nhận được số lượng các thông số cho phương pháp cụ thể (thay vì đề cập đến tài liệu)?

.methods chỉ trả về tên phương thức, không phải danh sách các tham số cho phương thức.

Trả lời

33

Bạn có thể sử dụng phương pháp Method#arity:

"string".method(:strip).arity 
# => 0 

Từ các tài liệu của Ruby:

Trả về một dấu hiệu cho thấy số lượng các đối số được chấp nhận bởi một phương pháp. Trả về số nguyên không âm cho các phương thức lấy số cố định là đối số. Đối với các phương thức Ruby có một số đối số biến, trả về -n-1, trong đó n là số đối số được yêu cầu. Đối với phương thức được viết bằng C, trả về -1 nếu cuộc gọi có số biến là đối số.

Vì vậy, ví dụ:

# Variable number of arguments, one is required 
def foo(a, *b); end 
method(:foo).arity 
# => -2 

# Variable number of arguments, none required 
def bar(*a); end 
method(:bar).arity 
# => -1 

# Accepts no argument, implemented in C 
"0".method(:to_f).arity 
# => 0 

# Variable number of arguments (0 or 1), implemented in C 
"0".method(:to_i).arity 
# => -1 


Cập nhật Tôi vừa mới phát hiện ra exitence của Method#parameters, nó có thể khá hữu ích:

def foo(a, *b); end 
method(:foo).parameters 
# => [[:req, :a], [:rest, :b]] 
+0

Cảm ơn bạn !!!!! – TDHM

8

Bạn có thể sử dụng arity

Trả về một chỉ số về số đối số được chấp nhận bởi một phương thức. Trả về một số nguyên không âm cho các phương thức lấy một số đối số cố định. Đối với các phương thức Ruby lấy một số các đối số biến, trả về -n-1, trong đó n là số đối số được yêu cầu. Đối với các phương thức được viết bằng C, trả về -1 nếu cuộc gọi nhận một số lượng đối số biến.

Ví dụ từ ruby-doc

class C 
    def one; end 
    def two(a); end 
    def three(*a); end 
    def four(a, b); end 
    def five(a, b, *c); end 
    def six(a, b, *c, &d); end 
end 

c = C.new 
c.method(:one).arity  #=> 0 
c.method(:two).arity  #=> 1 
c.method(:three).arity #=> -1 
c.method(:four).arity #=> 2 
c.method(:five).arity #=> -3 
c.method(:six).arity  #=> -3 
Các vấn đề liên quan