Ruby:检查从实例化类传递到模块方法的参数数量

时间:2015-01-15 14:43:35

标签: ruby methods module arguments

我试图找到从我的实例化类传递给模块方法的参数数量。

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。

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