问题描述
出于某种原因,我将方法存储在Proc中,并且想检查它们是否已定义。
如果我这样做:defined? 1.+
我得到method
作为回报,所以我知道+
方法已定义。
现在,如果我将方法存储在Proc中:p = Proc.new { 1.+ }
,
我想知道如何检查p
中存储的方法是否已定义
我已经测试过defined? p
或defined? p.call
,但这不是照看的结果...
感谢您的帮助!
解决方法
defined?
用于测试是否定义了变量或常量是否存在,而不是方法本身。
为此,您应该使用:
1.method(:+)
如果该方法不存在,则会出现NameError
异常。但是,这并不是最好的测试方法,相反,它有一个更简单的方法:
1.respond_to?(:+)
如果该方法“响应”该方法调用,则该方法将(通常)返回true
。由于Ruby是一种高度动态的编程语言,并且可以通过method_missing
和其他技巧来现场编写方法,因此这可能不是100%准确的,但是它是针对预定义的方法。
不幸的是,一旦在Proc
中包装了一些有效的Ruby代码,就无法在不执行的情况下对其进行测试。这意味着,如果您拥有Proc,则基本上是一个黑匣子,可以不深入研究VM中的技巧,但这是特定于Ruby实现的。