2

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

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 = nilnil因此返回 false,尽管分配成功。

这一切都像预期的那样吗?

4

5 回答 5

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.

于 2013-07-02T00:04:26.933 回答
5

我相信这一点:

if a = nil

应该:

if a == nil

一个单一的=手段分配,并a = nil分配nila评估nil结果,这是错误的。这就是执行不进入puts零件的原因,而==意味着平等测试。

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

于 2013-07-02T00:02:37.613 回答
2

假设您打算a = nil成为一项任务并且知道这不是比较,那么无论它是否成功,它都不会返回。

它返回分配的值,即nil.

于 2013-07-02T00:04:37.413 回答
1

您提供的示例按预期运行。

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

if a == nil
  puts "should be nil"
end
=> nil
> a
=> "bar"
于 2013-07-02T00:02:51.670 回答
1
a = "foo"­
# => "foo"
a = nil ? nil : a
# => "foo"
a
# => "foo"

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

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

于 2013-07-02T03:47:39.457 回答