我对运营商defined?
不太清楚。
例如:
defined? var
为什么不:
defined? :var defined? 'var' ## i think these two ways maybe make more sense
但是这个运算符也可以跟一个表达式。
此操作员在什么阶段执行?在编译阶段,类似于C中的sizeof(int)
答案 0 :(得分:7)
在不同的情况下,您希望检查不同扩展级别的内容。 defined?
用于检查逐字表达式。如果您执行defined? :var
或defined? "var"
,它们将始终提供真值,因为:var
和"var"
是有效的Ruby表达式(符号和字符串)。
如果要检查表达式的单级扩展,则有特定的方法。在这种情况下,如果要检查是否存在此类方法,可以执行respond_to? :var
或respond_to? "var"
。如果要检查是否存在此类变量,则可以执行local_variables.key?(:var)
。
此外,defined?
不仅仅用于检查单个令牌。它还用于检查复杂的表达式,如[1, 2, 3].each{|x| puts x}
。如果你不得不用符号来表达它,那将是不方便的。
<小时/> 这个问题的最后一部分非常有趣。通常,当要执行某个方法时,会事先评估其所有参数(但不是块)。对于
defined?
,其参数未被评估;它只是解析。它表现得像是在阻止它。 RDoc说:请注意,表达式未执行。我无法回答如何做到这一点。