界定?怪事

时间:2012-11-09 07:45:39

标签: ruby

今天早上我在Ruby遇到一个奇怪的事情,关于三元运算符。它是怎么回事:

x = nil ? x : true 

众所周知,x设置为 true ,这并不奇怪。现在,随后运行:

defined?(y) 
=> nil

这个答案意味着y尚未定义。但是:

defined?(y) ? y : true

返回 true 。再也不用惊讶了。惊喜来到这里:

y = defined?(y) ? y : true 

会发生什么? y设置为nil

但等等,还有更多。现在分配y后,让我们使用z

defined?(z) 
#=> nil

暗示z尚未定义。

z = defined?(z) ? false : true

令人惊讶的是:z设置为 false 。我不知道会发生什么。在if块中执行相同操作会得到相同的结果。

z1 = if defined?(z1) then z1 else true end

再次z1设置为nil

z2 = if defined?(z2) then false else true end

这也让我感到惊讶,因为z2设置为false。现在我假设上面的表达式表现得像:

z3 = if nil then false else true end
考虑到z3在上述所有情况下都返回true这一事实,defined?nil分配给defined?。这让我相信{{1}}调用有一些特别的工作,但我在Ruby文档中找不到相关的信息。

顺便说一下。我在ruby 1.8.7和1.9.2

上测试了上面的内容

1 个答案:

答案 0 :(得分:0)

确定。我认为这解释了它:

ccc = (ccc == nil)
=> true

显然,无论何时为变量赋值,ruby首先将其初始化为nil。