为什么没有赋值的三元运算符会返回预期的输出?

时间:2013-07-01 23:57:55

标签: ruby if-statement variable-assignment conditional-operator

我想知道为什么三元运算符的赋值反应奇怪:

a = "foo"­
=> "foo"
a = nil ? nil : a
=> "foo"
a
=> "foo"

但:

a = nil ? nil : a
=> "foo"
a = "bar"­ ? "bar"­ : a
=> "bar"
a
=> "bar"

if a = nil
  puts "should be nil"
end
=> nil

不会puts字符串,因为a = nil会返回nil因此为假,尽管作业成功了。

这一切都表现得有意吗?

5 个答案:

答案 0 :(得分:7)

if a = nil

这不是返回false,而是返回已分配的内容,在本例中为nilnil是'假的',这就是为什么它不会进入puts

至于原因:

a = "foo"­
=> "foo"
a = nil ? nil : a
=> "foo"
a
=> "foo"

这是因为您要再次分配anil ? nil : a返回a,以便分配内容。因此,a = nil ? nil: a最终会被解释为a = a

答案 1 :(得分:5)

我相信:

if a = nil

应该是:

if a == nil

单个=表示分配,而a = nil正在将nil分配给a并作为结果评估为nil,这是错误的。这就是为什么执行没有进入puts部分,而==意味着进行相等测试。

除此之外,您在代码中发现了什么奇怪的内容?毕竟这是正常的行为。

答案 2 :(得分:2)

假设您打算将a = nil作为一项作业,并且知道它不是一项比较,它不会返回它是否成功。

返回指定的值,即nil

答案 3 :(得分:1)

您提供的示例符合预期。

也许您将赋值运算符=与比较运算符==混淆。尝试最后一段这样的代码:

if a == nil
  puts "should be nil"
end
=> nil
> a
=> "bar"

答案 4 :(得分:1)

a = "foo"­
# => "foo"
a = nil ? nil : a
# => "foo"
a
# => "foo"

为了解释上面的内容,我将从这开始 - “Ruby中的每个东西都是一个除了块之外的对象; Ruby中的所有对象都有一个真值,除了nilfalse。”因此,在上面的代码部分a = nil ? nil : a中,表达式将被评估为a = a。这就是为什么'foo'has been returned as a value of a`。

a = "bar"­ ? "bar"­ : a
# => "bar"
a
# => "bar"

正如我刚才所说,除了nilfalse所有对象都有真正的价值,“bar”总是true。所以表达式a = "bar"­ ? "bar"­ : a将被评估为a = "bar"

if a = nil
  puts "should be nil"
end
=> nil

如上所述,if a = nil部分也有同样的解释。因此false控件不会进入if子句主体,并返回nil