我想知道为什么三元运算符的赋值反应奇怪:
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
因此为假,尽管作业成功了。
这一切都表现得有意吗?
答案 0 :(得分:7)
if a = nil
这不是返回false,而是返回已分配的内容,在本例中为nil
。 nil
是'假的',这就是为什么它不会进入puts
至于原因:
a = "foo"
=> "foo"
a = nil ? nil : a
=> "foo"
a
=> "foo"
这是因为您要再次分配a
。 nil ? 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中的所有对象都有一个真值,除了nil
和false
。”因此,在上面的代码部分a = nil ? nil : a
中,表达式将被评估为a = a
。这就是为什么'foo'has been returned as a value of
a`。
a = "bar" ? "bar" : a
# => "bar"
a
# => "bar"
正如我刚才所说,除了nil
和false
所有对象都有真正的价值,“bar”总是true
。所以表达式a = "bar" ? "bar" : a
将被评估为a = "bar"
。
if a = nil
puts "should be nil"
end
=> nil
如上所述,if a = nil
部分也有同样的解释。因此false
控件不会进入if
子句主体,并返回nil
。