首页 > 解决方案 > 检查是否定义了在 Proc 中编写的方法?

问题描述

出于某种原因,我将方法存储在 Proc 中,并且我想检查它们是否已定义。

如果我这样做:defined? 1.+ 我得到method回报,所以我知道+方法已定义。

现在,如果我将方法存储在 Proc :p = Proc.new { 1.+ }中,

我想知道如何检查存储的方法p是否已定义

我已经测试过defined? pdefined? p.call但不是参加的结果...

谢谢你的帮助 !

标签: rubyprocdefined

解决方案


defined?用于测试是否定义了变量或是否存在常量,而不是方法本身。

为此,您应该使用:

1.method(:+)

如果该方法不存在,则会出现NameError异常。不过,这不是最好的测试方法,而是有一个更简单的方法:

1.respond_to?(:+)

如果该方法“响应”该方法调用,它将(通常)返回true。由于 Ruby 是一种高度动态的编程语言,并且可以通过method_missing其他技巧在现场编写方法,因此这可能不是 100% 准确,但它适用于预定义的方法。

不幸的是,一旦您将一些有效的 Ruby 代码包装在 aProc中,就无法再测试它是否会在不执行它的情况下工作。这意味着如果你有一个 Proc,它基本上是一个黑盒子,没有深入研究 VM 中的技巧,但这是特定于 Ruby 实现的。


推荐阅读