找出Ruby对象是否实现了接受一定数量参数的方法

时间:2016-04-23 14:09:59

标签: ruby

我想知道是否可以使用0个参数调用方法count

@object.count()
@object

而不引发错误。有没有一种方法可以给我这些信息?

如果没有,那么实施它是否有任何问题:

begin
  count = @object.count()
  # Do anything with the information
rescue ArgumentError => e
end

3 个答案:

答案 0 :(得分:3)

首先:检查一个方法的参数个数听起来有些不对劲。 其次,你正在寻找" arity":

@object.method(:count).arity

在您可能想要检查对象是否响应给定方法之前。

@object.respond_to?(:count) && @object.method(:count).arity == 0

请注意,如果方法采用可变数量的参数,那么arity就不那么直观了:

  

对于采用可变数量参数的Ruby方法,返回   -n-1,其中n是所需参数的数量。对于用C编写的方法,如果调用采用可变数量的参数,则返回-1。

答案 1 :(得分:3)

我们可以将问题改为:该方法是否具有任何必需参数?或者:没有所需的参数吗?

@object.method(:count).parameters.none? {|type, _| [:req, :keyreq].include?(type) }

这将允许您捕获具有可选参数和默认参数的方法,具有可选关键字参数和默认值的方法,以及具有可选休息参数的方法。

我发现parameters比重载的单整数返回值arity更容易处理。

答案 2 :(得分:0)

您需要arity方法:

@object.method(:count).arity

http://ruby-doc.org/core-2.2.0/Method.html#method-i-arity