【发布时间】:2012-10-29 12:54:12
【问题描述】:
今天早上我在 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
其中z3 被分配给true,考虑到defined? 在上述所有情况下都返回nil。这让我相信在 defined? 调用周围有一些特别的工作,但我在 Ruby 文档中找不到有关它的信息。
顺便说一句。我在 ruby 1.8.7 和 1.9.2 上测试了上述内容
【问题讨论】:
-
@SergioTulentsev 不知道为什么它属于同一类别
-
@Viren:因为这不是关于
defined?,而是关于assignemnt 在ruby 中的工作方式。 -
@SergioTulentsev 只需检查最后一次编辑如果可以的话,我很乐意让这个问题结束,即
y = (defined?(y) ? y : true ) -
@SergioTulentsev 点虽然被接受,但我的观点是
^^然后不应该像我提到的那样工作
标签: ruby