Поскольку Ruby 2.3 вводит оператор безопасной навигации (&.), он же оператор одиночества, поведение объекта nil кажется странным.

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

Это предназначено для такого поведения? Или какой-то крайний случай, который ускользнул при добавлении одинокого оператора?

26
sbs 4 Янв 2016 в 03:15

2 ответа

Лучший ответ

foo&.bar - это сокращение для foo && foo.bar, так что, по вашему мнению, будет результат выражения nil && nil.nil??

34
mwp 4 Янв 2016 в 00:22

Это потому, что 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 маловероятно, что это имело бы смысл в нормальной логике.

8
Magne 12 Мар 2017 в 11:56