【问题标题】:defined? weirdness [duplicate]定义?怪异[重复]
【发布时间】: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


【解决方案1】:

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

ccc = (ccc == nil)
=> true

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

【讨论】:

  • 接受点是否定义了为什么if 在上述情况下的功能不同
  • 还有一点是y = (defined?(y) ? y : true) 产生与我上面描述的相同的结果,即设置为nil
  • 是的,也许可以解释上述情况
猜你喜欢
  • 2012-10-02
  • 1970-01-01
  • 2012-04-20
  • 2019-05-09
  • 2021-11-18
  • 1970-01-01
  • 2015-10-06
  • 2018-06-22
  • 1970-01-01
相关资源
最近更新 更多