使用irb
,我们可以通过执行以下操作列出特定对象的方法:
"Name".methods
但是如果我想知道一个特定的方法需要多少个参数,我该如何实现呢?我的意思是有什么办法(通过在 irb 上点击一些命令),我们可以获得特定方法的参数数量(而不是参考文档)?
.methods
仅返回方法名称,而不是方法的参数列表。
使用irb
,我们可以通过执行以下操作列出特定对象的方法:
"Name".methods
但是如果我想知道一个特定的方法需要多少个参数,我该如何实现呢?我的意思是有什么办法(通过在 irb 上点击一些命令),我们可以获得特定方法的参数数量(而不是参考文档)?
.methods
仅返回方法名称,而不是方法的参数列表。
您可以使用以下方法Method#arity
:
"string".method(:strip).arity
# => 0
来自 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
更新我刚刚发现了 的存在Method#parameters
,它可能非常有用:
def foo(a, *b); end
method(:foo).parameters
# => [[:req, :a], [:rest, :b]]
您可以使用arity
返回方法接受的参数数量的指示。为采用固定数量参数的方法返回一个非负整数。对于采用可变数量参数的 Ruby 方法,返回 -n-1,其中 n 是所需参数的数量。对于用 C 编写的方法,如果调用采用可变数量的参数,则返回 -1。
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
当您无法使用其他答案中定义的方法时,有一种特殊情况。这是关于#initialize
一些还没有实例的类的方法。
如果你尝试Method#arity
for SomeClass::new
,你总是会得到 -1:
class SomeClass
def initialize(a, b)
end
end
SomeClass.method(:new).arity # => -1
你需要一个你的类的实例SomeClass
来使用Method#arity
它,但是你不能得到这个实例,因为你还不知道需要多少个参数SomeClass::new
。
幸运的是,这个问题可以解决。只需使用instance_method(:initialize)
on SomeClass
,您将获得所需的结果:
class SomeClass
def initialize(a, b)
end
end
SomeClass.instance_method(:initialize).arity # => 2
顺便说一句,您可以将此方法用于某个类的任何实例方法,而无需创建此类的实例。例如,以下两行将给出相同的结果:
"string".method(:strip).arity # => 0
String.instance_method(:strip).arity # => 0