ruby 方法列出 self 关键字参数

use*_*416 0 ruby

是否有可以在方法上调用的方法来列出关键字参数?

我正在寻找的是类似的东西

self.keyword_arguments
Run Code Online (Sandbox Code Playgroud)

例如,在下面的示例中,我正在寻找一个数组:

 [:var1, :var2]
Run Code Online (Sandbox Code Playgroud)
def test( var1: true, var2: false)
  self.keyword_arguments
end 
Run Code Online (Sandbox Code Playgroud)

Ste*_*fan 7

在 Ruby 中,方法不是一流对象。引用一个方法已经执行了它。这就是为什么我们经常使用符号通过名称来引用方法。为了以面向对象的方式处理方法,Ruby 提供了类Method作为包装器。一旦获得Method方法的实例,您就可以内省它(或让它内省本身)。

这有点复杂,但这就是您处理它的方法:

def test( var1: true, var2: false)
  method(__method__)
    .parameters
    .filter_map { |k, v| v if k == :key || k == :keyreq }
end

test
#=> [:var1, :var2]
Run Code Online (Sandbox Code Playgroud)

解释:

  • method通过名称查找方法并返回其Method实例
  • __method__以符号形式返回当前方法的名称,即:test在上面的代码中(通过硬编码method(:test)也可以)
  • parameters以类型/名称对的形式返回参数数组

对于您的方法,后者返回[[:key, :var1], [:key, :var2]]:key表示一个可选关键字参数(具有默认值)。:keyreq将表示必需的关键字参数(没有默认值的参数),但您的方法中没有任何关键字参数。

还有:keyrest任意关键字参数,例如**kwargs. 我没有包含:keyrest在输出中,因为**参数名称仅供该方法的“内部”使用,而调用者实际上并未使用它来传递这些额外的关键字参数。

filter_map然后返回我们感兴趣的键的值(即参数名称)。