由于Ruby 2.3引入了安全导航操作符(&.
),即孤独运算符,nil
对象上的行为似乎很奇怪.
nil.nil? # => true nil&.nil? # => nil
这样设计的行为是这样吗?或者在添加孤独运算符时滑落的边缘情况?
foo&.bar
是简写foo && foo.bar
,所以你期望表达式的结果nil && nil.nil?
是什么?
这是因为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
,因此在正常逻辑中这不太可能有意义.