安全导航操作员(&。)为零
由于Ruby 2.3引入了安全导航操作符( &.
),也就是孤独运算符,所以nil
对象上的行为似乎很奇怪。
nil.nil? # => true nil&.nil? # => nil
这样设计的行为是这样吗? 或者在添加孤独运算符时滑落的边缘情况?
foo&.bar
是foo && foo.bar
简写,那么你期望表达式nil && nil.nil?
的结果是nil && nil.nil?
成为?
这是因为nil&.nil?
是nil && nil.nil?
简写nil && nil.nil?
。 这将评估为nil && true
,然后nil
。
(nil && x).nil?
对于x
任何值,始终求值为true
。
虽然语法很有用,但这个特定情况有可能成为开发人员的“陷阱”:
(stuff&.things).nil?
=>如果东西不存在,则生成true
,或者stuff.things
返回nil
。
与下面的案例:
stuff&.things&.nil?
=>除了stuff.things
返回除nil
之外的其他内容之外,在每种情况下都会生成nil
,在这种情况下它将返回false
。
由于普通布尔逻辑难以区分false
和nil
,因此在正常逻辑中这不太可能有意义。