我正在玩自省,希望在运行时提取参数计数和参数名称有可能实施这样的措施吗?

class Greeter
   def self.greet(name, weekday = "Friday")
     "Hello #{name}. Today is #{weekday}"
   end

   def self.splatter(*arguments)
     arguments.join("|")
   end
end

Greeter.argument_count(:greet)
=> 1..2

Greeter.argument_names(:greet)
=> [:name, :weekday]

Greeter.argument_count(:splatter)
=> [0..Infinity]

我不知道如何检索参数的名称。
然而,我通过故意调用带有大量随机参数的方法来提取参数计数,这些随机参数仅用于触发ArgumentError,然后从异常消息中提取允许数量的参数但是,这是危险的,不适用于splat方法签名。

最佳答案

这些东西有一个固定的格式您可以修改以下内容以满足您的需要。

class Object
  def argument_count m; method(m).arity end
  def argument_names m; method(m).parameters end
end

Greeter.argument_count(:greet) # => -2
Greeter.argument_names(:greet) # => [[:req, :name], [:opt, :weekday]]

10-08 14:46