26

由于 Ruby 2.3 引入了安全导航操作符(&.),也就是孤独操作符,nil对象上的行为看起来很奇怪。

nil.nil?    # => true
nil&.nil?   # => nil

这是设计成这样吗?还是在添加孤独运算符时滑落的一些边缘情况?

4

2 回答 2

34

foo&.bar是 的简写foo && foo.bar,那么您希望表达式的结果nil && nil.nil?是什么?

于 2016-01-04T00:22:43.770 回答
8

这是因为nil&.nil?是 的简写nil && nil.nil?。这将评估为nil && true,则为nil

(nil && x).nil?true对于 的任何值,总是计算为x

虽然语法很强大,但这种特殊情况有可能成为开发人员的“陷阱”:

(stuff&.things).nil?=>true如果东西不存在,这会产生,或者stuff.things返回nil

与以下情况相比:

stuff&.things&.nil?=> 这nil在所有情况下都会产生,除了stuff.things返回以外的东西的情况nil,在这种情况下它会返回false

由于区分false和的普通布尔逻辑中的困难nil,这在普通逻辑中不太可能有意义。

于 2016-01-04T00:49:10.093 回答