【问题标题】:Ruby method introspectionRuby 方法自省
【发布时间】:2014-07-04 12:29:27
【问题描述】:

我正在玩自省,想在运行时提取参数计数和参数名称。有没有可能实现这样的东西?

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 方法签名。

【问题讨论】:

    标签: ruby metaprogramming introspection


    【解决方案1】:

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

    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]]
    

    【讨论】:

    • arity 的结果可能有点难以解释 - 请查看 Method 上的 ruby​​doc 页面,了解它是如何计算的。
    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 2011-01-30
    • 2018-01-01
    • 2020-02-12
    • 2011-02-10
    • 2015-11-22
    • 2022-10-25
    • 2017-11-22
    相关资源
    最近更新 更多