Ruby的定义?操作者

时间:2013-06-25 02:26:55

标签: ruby

我对运营商defined?不太清楚。

例如:

 defined? var

为什么不:

defined? :var
defined? 'var'  ## i think these two ways maybe make more sense

但是这个运算符也可以跟一个表达式。

此操作员在什么阶段执行?在编译阶段,类似于C中的sizeof(int)

1 个答案:

答案 0 :(得分:7)

在不同的情况下,您希望检查不同扩展级别的内容。 defined?用于检查逐字表达式。如果您执行defined? :vardefined? "var",它们将始终提供真值,因为:var"var"是有效的Ruby表达式(符号和字符串)。

如果要检查表达式的单级扩展,则有特定的方法。在这种情况下,如果要检查是否存在此类方法,可以执行respond_to? :varrespond_to? "var"。如果要检查是否存在此类变量,则可以执行local_variables.key?(:var)

此外,defined?不仅仅用于检查单个令牌。它还用于检查复杂的表达式,如[1, 2, 3].each{|x| puts x}。如果你不得不用符号来表达它,那将是不方便的。

<小时/> 这个问题的最后一部分非常有趣。通常,当要执行某个方法时,会事先评估其所有参数(但不是块)。对于defined?,其参数未被评估;它只是解析。它表现得像是在阻止它。 RDoc说:请注意,表达式未执行。我无法回答如何做到这一点。