Почему в Ruby используется собственный синтаксис оператора безопасной навигации?
В Ruby 2.3.0 введен синтаксис безопасной навигации, который упрощает обработку цепочек вызовов метода с помощью nil, вводя новый оператор, который вызывает метод, только если значение предыдущего оператора не равно nil. Эта функция уже существует, например, в C#, Groovy и Swift. Например, в Groovy, синтаксис
foo?.bar
что в основном означает, что значением результата является значение foo.bar, если foo не равно нулю, и в этом случае возвращаемое значение также равно нулю, и, следовательно, исключение не выдается. Также C# (называемые нулевыми условными операторами) и Swift (называемые необязательными выражениями) используют эту нотацию.
Таким образом, синтаксис кажется вполне стандартным в других языках. Теперь, почему в Ruby синтаксис
foo&.bar
вместо?
1 ответ
Этот ответ основан на обсуждении запроса функции в системе отслеживания ошибок Ruby. По словам автора Ruby Юкихиро Мацумото, ввести оператора было бы невозможно ?.
в рубине потому что foo?
является допустимым именем метода и, следовательно, не может быть проанализирован. Первым кандидатом в оператор была обратная последовательность .?
, Этот синтаксис уже был реализован (Nobuyoshi Nakada), но позже был отброшен, так как считалось, что он слишком близок к оригинальному синтаксису, введенному другими языками (который не был осуществим, как упоминалось ранее). Окончательный синтаксис &.
был принят в соответствии с предложением Мацумото.
Вот обоснование этого синтаксиса, данное Мацумото
Я думаю об этом некоторое время, и думаю о представлении
&.
вместо.?
, так как:
.?
похож на?.
на Swift и других языках, но все равно отличается.- поскольку
?
является допустимым суффиксом имен методов в Ruby, мы уже видим много вопросительных знаков в наших программах.u&.profile
напоминает нам как короткую формуu && u.profile
,Но поведение
&.
должен быть сохранен, то есть он должен пропуститьnil
но признатьfalse
,
Этот синтаксис был затем выпущен как часть Ruby 2.3.0-preview1.