Ruby 获取命名或可选参数的默认值

Ruby 获取命名或可选参数的默认值,ruby,Ruby,我有一个方法如下所示: class A def my_method(a: 'key value', b = 'opt value') # ... end end A.new.method(:my_method).parameters # => [[:key, :a], [:opt, :b]] 使用反射,我可以获得如下参数名称: class A def my_method(a: 'key value', b = 'opt value') # ... end

我有一个方法如下所示:

class A
  def my_method(a: 'key value', b = 'opt value')
    # ...
  end
end
A.new.method(:my_method).parameters
# => [[:key, :a], [:opt, :b]]
使用反射,我可以获得如下参数名称:

class A
  def my_method(a: 'key value', b = 'opt value')
    # ...
  end
end
A.new.method(:my_method).parameters
# => [[:key, :a], [:opt, :b]]

如何在不调用
my_方法的情况下获取这些参数的默认值?

这是不可能的。我现在找不到线程,但matz明确表示这是设计的。问题在于默认值是一个任意表达式,而且由于Ruby中的所有内容都是一个表达式,所以它可以是任何内容

例如,这个呢:

def foo(bar = if rand < 0.5 then Time.now else rand end)
def foo(bar=如果rand<0.5那么Time.now else rand end)
你建议的方法会在这里返回什么

基本上,您有两种选择:

  • 计算默认值表达式。这意味着您将获得一些值,但这并不能告诉您真正的表达式是什么
  • 不要通过将默认值表达式打包到
    Proc
    中来计算它。但是无法再次从
    Proc
    中获取表达式

因此,无论哪种方式,您实际上都不会得到任何有用的信息。

看起来这可以使用Merb的action args库来完成。看看这个答案,看看它是否能满足你的需求?正如Antti所建议的,我会从Merb的源代码中挑选您想要的。只是吹毛求疵,但我认为可选参数需要在参数列表中放在第一位,所以
my_方法(b='opt',a:'key')
为什么要这样做?你想得到什么?@spickermann我想得到默认值。@Max:当然,但是为什么需要默认值呢?您想如何处理此信息?这种做法似乎违反了法律。对我来说,你的问题听起来像是个问题。谢谢你的解释。