1

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

x = nil ? x : true 

众所周知,x设置为true,也就不足为奇了。现在,随后运行:

defined?(y) 
=> nil

这个答案意味着y尚未定义。然而:

defined?(y) ? y : 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

wherez3被分配到,考虑到在上述所有情况下返回true的事实。这让我相信call 有一些特别的工作,但我在 Ruby 文档中找不到关于它的信息。defined?nildefined?

顺便提一句。我在 ruby​​ 1.8.7 和 1.9.2 上测试了上述内容

4

1 回答 1

0

好的。我认为这解释了它:

ccc = (ccc == nil)
=> true

显然,每当你给一个变量赋值时,ruby 首先将它初始化为 nil。

于 2012-11-09T07:50:48.543 回答