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 中为 splat 参数设置默认值

如何在子类中添加命名参数或在 Ruby 2.2 中更改它们的默认值?

如何检查是不是设置了可选功能参数

是否可以在 Ruby 中使用默认参数定义块?

php中laravel框架的控制器如何获取路由传过来的可选参数?

将空数组作为可选参数的默认值传递[重复]