假设我有一个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版本的解决方案。
答案 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