Ruby:如何获取可选proc参数的默认值

时间:2014-12-23 09:09:31

标签: ruby function reflection default-value optional-parameters

假设我有一个proc / lambda / block / method / etc,就像这样:

2.1.2 :075 > procedure = Proc.new { |a, b=2, *c, &d| 42 }
 => #<Proc:0x000000031fcd10@(irb):75> 

我知道我可以找到参数的名称:

2.1.2 :080 > procedure.parameters
 => [[:opt, :a], [:opt, :b], [:rest, :c], [:block, :d]]

但是,如果给出给定的可选参数,我该如何获取该值?


PS:是的。我知道在here之前已经问过/已经回答过,但是之前的解决方案需要使用merb gem,这实际上有点误导。 merb本身取决于methopara宝石(除非您使用JRuby或MRI,我不是),它本身在问题得到解答时提供了该功能。

可悲的是,目前,methopara似乎是放弃软件。此外,它只支持ruby 1.9(甚至不支持最新版本),所以我正在寻找适用于当前ruby版本的解决方案。

1 个答案:

答案 0 :(得分:2)

假设proc / lambda是在文件中定义的,您可以使用source_location方法查找该文件的位置及其定义的行号。

2.2.0 (main):0 > OH_MY_PROC.source_location
=> [
  [0] "sandbox/proc.rb",
  [1] 1
]

File.readlines的帮助下,我们可以制作一个简短的方法,当传递proc / lambda时,可以吐出它定义的源代码行。

def view_def proc_lambda
  location = proc_lambda.source_location
  File.readlines(location[0])[location[1]-1]
end

在行动中它看起来像这样

2.2.0 (main):0 > view_def OH_MY_PROC
=> "OH_MY_PROC = Proc.new { |a, b=2, *c, &d| 42 }\n"
2.2.0 (main):0 > view_def OH_MY_LAMBDA
=> "OH_MY_LAMBDA = ->(a, b=2, *c, &d) { 42 }\n"

如果你想对方法做同样的事情,它会变得更加复杂。在这种情况下,我建议您阅读Pragmatic Studio博客中的这篇博文:"View Source" On Ruby Methods