使用irb
,我们可以通过以下方式列出特定对象的方法:
"Name".methods
Run Code Online (Sandbox Code Playgroud)
但是如果我想知道特定方法需要多少参数,我该如何实现呢?我的意思是有什么办法(通过在irb上点击一些命令),我们可以得到特定方法的参数数量(而不是指代文档)?
.methods
仅返回方法名称,而不返回方法的参数列表.
tor*_*o2k 37
您可以使用以下方法Method#arity
:
"string".method(:strip).arity
# => 0
Run Code Online (Sandbox Code Playgroud)
从Ruby文档:
返回方法接受的参数数量的指示.返回采用固定数量参数的方法的非负整数.对于采用可变数量参数的Ruby方法,返回-n-1,其中n是所需参数的数量.对于用C编写的方法,如果调用采用可变数量的参数,则返回-1.
所以,例如:
# 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
Run Code Online (Sandbox Code Playgroud)
更新我刚发现它的出口Method#parameters
,它可能非常有用:
def foo(a, *b); end
method(:foo).parameters
# => [[:req, :a], [:rest, :b]]
Run Code Online (Sandbox Code Playgroud)
您可以使用 arity
返回方法接受的参数数量的指示.返回采用固定数量参数的方法的非负整数.对于采用可变数量参数的Ruby方法,返回-n-1,其中n是所需参数的数量.对于用C编写的方法,如果调用采用可变数量的参数,则返回-1.
来自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
Run Code Online (Sandbox Code Playgroud)