5

我不太清楚运营商defined?

例如:

 defined? var

为什么不:

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

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

这个算子在什么阶段执行?在编译阶段,类似于sizeof(int)C?

4

1 回答 1

7

在不同的上下文中,您希望在不同的扩展级别上检查事物。defined?用于检查逐字表达。如果您使用defined? :varor defined? "var",它们将始终给出真实值,因为:varand"var"是有效的 Ruby 表达式(符号和字符串)。

如果要检查表达式的一级扩展,则有特定的方法。在这种情况下,如果你想检查这种方法是否存在,你可以做respond_to? :varor respond_to? "var"。如果你想检查这样的变量是否存在,那么你可以做local_variables.key?(:var).

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


这个问题的最后一部分非常有趣。通常,当要执行一个方法时,它的所有参数都会被预先评估(但不是块)。对于defined?,它的论点不被评估;它只是被解析。它的行为就好像它正在占用一个块。RDoc说:请注意,表达式未执行。我无法回答这是如何完成的。

于 2013-06-25T02:37:14.820 回答