今天早上我在 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?
nil
defined?
顺便提一句。我在 ruby 1.8.7 和 1.9.2 上测试了上述内容