Почему в 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.

Другие вопросы по тегам