我试图找到从我的实例化类传递给模块方法的参数数量。
class A
inclue ModuleA
end
A.new.moduleA_method(arg1, arg2, arg3)
这是模块A中的内容
moduleA
def moduleA_method(arg1, arg2, arg3)
puts ARGV.size
end
end
ARGV.size打印0,但根据我的理解它应该是3。
答案 0 :(得分:3)
您可以使用method方法将方法作为对象。然后调用arity
以获取该方法的参数数量。
MyClass.new.method(:some_method).arity
__method__
将当前方法的名称作为符号返回。
全部放在一起:
class Foo
def bar(arg1, arg2)
self.method(__method__).arity # => 2
end
end
答案 1 :(得分:3)
好的,首先没有人提到定义像这样的方法签名的事实
def some_method(arg1,arg2,arg3)
将需要3个参数,否则你会获得ArgumentError: wrong number of arguments (0 for 3)
或者你传递的数量。因此在方法中引用arity是没用的,因为你不能在不知道所需参数数量的情况下通过错误。
然而,您可以定义类似
的方法def some_method(*args)
puts args.size
end
这将收集在一个遗嘱中传递的参数,例如。
some_method
0
#=> nil
some_method "a","b","c"
3
#=> nil
这样可以让论据具有完全的灵活性,我认为根据我的阅读方式,我们正在寻找更多内容
答案 2 :(得分:0)
关闭但不完全。 ARGV常量实际上包含传递给脚本而不是方法的所有参数。因此,如果您使用参数从命令行调用脚本,那么它们将处于此常量中。
如果脚本名为" example.rb"包含:
puts ARGV.length
如果你在命令行上调用它,就像这样:
> ruby example.rb
你会得到0
如果您这样称呼它:
> ruby example.rb an_argument
你会得到1