由于Ruby 2.3引入了安全导航操作符(&.
),a.k.a孤独运算符,nil
对象上的行为似乎很奇怪。
nil.nil? # => true
nil&.nil? # => nil
这样设计的行为方式是这样吗?或者在添加孤独运算符时滑落的边缘情况?
答案 0 :(得分:32)
foo&.bar
是foo && foo.bar
的简写,那么您期望表达式nil && nil.nil?
的结果是什么?
答案 1 :(得分:7)
这是因为nil&.nil?
是nil && nil.nil?
的简写。这将评估为nil && true
,然后是nil
。
(nil && x).nil?
的任何值, true
始终评估为x
。
虽然语法有力量,但这个具体案例有可能成为一个问题。对于开发者:
(stuff&.things).nil?
=>如果内容不存在,则会生成true
,或stuff.things
返回nil
。
VS。以下案例:
stuff&.things&.nil?
=>除了nil
返回stuff.things
之外的其他内容之外,每种情况都会生成nil
,在这种情况下,它会返回false
。
由于普通布尔逻辑难以区分false
和nil
,因此在正常逻辑中这不太可能有意义。