问题
As Ruby 2.3 introduces the Safe navigation operator(&.
), a.k.a lonely operator, the behavior on nil
object seems odd.
nil.nil? # => true
nil&.nil? # => nil
Is that designed to behave like this way? Or some edge case that slipped away when adding the lonely operator?
回答1:
foo&.bar
is shorthand for foo && foo.bar
, so what would you expect the result of the expression nil && nil.nil?
to be?
回答2:
This is because nil&.nil?
is shorthand for nil && nil.nil?
. This would evaluate to nil && true
, which is then nil
.
(nil && x).nil?
always evaluates to true
, for any value of x
.
While the syntax has power, this specific case has some potential to become a 'gotcha' for a developer:
(stuff&.things).nil?
=> This produces true
if stuff doesn't exist, or stuff.things
returns nil
.
vs. the below case:
stuff&.things&.nil?
=> This produces nil
in every case except the case where stuff.things
returns something other than nil
, in which case it would return false
.
Because of the difficulty in normal boolean logic of differentiating between false
and nil
, it is unlikely that this would make sense in normal logic.
来源:https://stackoverflow.com/questions/34583168/safe-navigation-operator-for-nil