Ruby:如何获取可选 proc 参数的默认值
Posted
技术标签:
【中文标题】Ruby:如何获取可选 proc 参数的默认值【英文标题】:Ruby: How to get the default value of optional proc arguments 【发布时间】:2015-02-21 09:48:58 【问题描述】:假设我有一个像这样的 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
gem(除非您使用的是 JRuby 或 MRI,我不是),它本身在回答问题时提供了该功能。
可悲的是,目前,methopara
似乎是废弃软件。此外,它只支持 ruby 1.9(甚至不支持其最新版本),所以我正在寻找适用于当前 ruby 版本的解决方案。
【问题讨论】:
我认为这几乎是不可能的,您必须考虑到所谓的default
值可以是任何类型的可执行代码,并且每次调用它都会执行。
@hakcho,非常好。 (自从我发布此帐户后,我完全忘记了这个帐户,并使用了一种完全不同的方法。)不过,以编程方式访问该值(或例程,如果它是一个)会很好。
【参考方案1】:
假设 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
【讨论】:
也可以使用merb。当您挽救异常并希望在文本编辑器中打开 proc 时,source_location 非常有用 @rivenfall 请查看原帖。由于放弃了依赖,Merb 不是一个选项。 @brownmike 我一直在寻找一种方法来做到这一点,而无需自己解析源代码,但感谢您的想法。无论如何,我从此走上了不同的道路。以上是关于Ruby:如何获取可选 proc 参数的默认值的主要内容,如果未能解决你的问题,请参考以下文章
如何在子类中添加命名参数或在 Ruby 2.2 中更改它们的默认值?