mik*_*kev 9 ruby reflection function 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>
Run Code Online (Sandbox Code Playgroud)
我知道我可以找到参数的名称:
2.1.2 :080 > procedure.parameters
=> [[:opt, :a], [:opt, :b], [:rest, :c], [:block, :d]]
Run Code Online (Sandbox Code Playgroud)
但是,如果没有给出给定的可选参数,我该怎么做?
PS:是的.我知道这之前已经被问过/回答了,但之前的解决方案需要使用merbgem,这实际上有点误导.merb它本身取决于methopara宝石(除非你在JRuby或MRI,我不是),它本身在回答问题时提供了这个功能.
可悲的是,目前methopara似乎是放弃了软件.此外,它只支持ruby 1.9(甚至不支持最新版本),所以我正在寻找适用于当前ruby版本的解决方案.
小智 2
假设 proc / lambda 是在文件中定义的,您可以使用该source_location方法查找该文件的位置及其定义的行号。
2.2.0 (main):0 > OH_MY_PROC.source_location
=> [
[0] "sandbox/proc.rb",
[1] 1
]
Run Code Online (Sandbox Code Playgroud)
在一些帮助下,File.readlines我们可以创建一个简短的方法,当传递 proc / lambda 时,可以吐出它定义的源代码行。
def view_def proc_lambda
location = proc_lambda.source_location
File.readlines(location[0])[location[1]-1]
end
Run Code Online (Sandbox Code Playgroud)
在行动中它看起来像这样
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"
Run Code Online (Sandbox Code Playgroud)
如果你想对方法做同样的事情,那就会变得更加复杂。在这种情况下,我建议阅读 Pragmatic Studio 博客中的这篇博文:“查看源代码”On Ruby 方法