Оператор безопасной навигации - Safe navigation operator
Эта статья нужны дополнительные цитаты для проверка. (Январь 2016) (Узнайте, как и когда удалить этот шаблон сообщения) |
В объектно-ориентированного программирования, то оператор безопасной навигации (также известен как необязательный оператор цепочки, оператор безопасного вызова, нулевой условный оператор) - бинарный оператор, возвращающий ноль если его первый аргумент равен нулю; в противном случае он выполняет операцию разыменования, как указано вторым аргументом (обычно доступ к члену объекта, индекс массива или вызов лямбда-выражения).
Он используется, чтобы избежать последовательных явных проверок и присвоений null и заменить их цепочкой методов / свойств. В языках программирования, где оператор навигации (например, «.») Приводит к ошибке при применении к нулевому объекту, оператор безопасной навигации останавливает оценку цепочки методов / полей и возвращает значение NULL в качестве значения выражения цепочки. В настоящее время он поддерживается на таких языках, как Апекс,[1] Apache Groovy,[2] Быстрый,[3] Рубин,[4] C #,[5] Котлин,[6] CoffeeScript, Scala[7], Дротик[8] и другие. В настоящее время для этого оператора нет общего соглашения об именах, но оператор безопасной навигации это наиболее широко используемый термин.
Основное преимущество использования этого оператора заключается в том, что он позволяет избежать пирамида гибели. Вместо написания нескольких вложенных еслиs, программисты могут просто использовать обычную цепочку, но добавлять символы вопросительного знака перед точками (или другими символами, используемыми для цепочки).
В то время как оператор безопасной навигации и нулевой оператор объединения оба операторы с нулевым значением, они операционно разные.
Примеры
Апекс
Примеры оператора безопасной навигации:[9]
а[Икс]?.метод().aField // Возвращает значение null, если [x] == nullа[Икс].метод()?.aField // возвращает null, если a [x] .aMethod () оценивается как nullНить URL профиля = Пользователь.getProfileUrl()?.toExternalForm();возвращаться [ВЫБРАТЬ Имя ИЗ Счет КУДА Идентификатор = :AccId]?.Имя;Groovy
Оператор безопасной навигации и оператор безопасного индекса:[10][11]
def имя = статья?.авторы?[0].имяЦель-C
В большинстве случаев можно использовать нормальный синтаксис навигации, не обращая внимания на NULL, так как базовые сообщения при отправке в NULL отбрасываются без каких-либо негативных последствий.
NSString *имя = статья.автор[0].имя;Быстрый
Необязательный оператор цепочки[12], оператор индекса и вызов:
позволять имя = статья?.авторы?[0].имяпозволять результат = protocolVar?.optionalRequirement?()Рубин
Ruby поддерживает &. оператор безопасной навигации (также известный как одинокий оператор) начиная с версии 2.3.0:[13]
имя = статья&.автор&.имяC #
C # 6.0 и выше имеют ?., то оператор нулевого условного доступа к члену (который также называют Оператор Элвиса от Microsoft, и его не следует путать с общим использованием термина Оператор Элвиса, эквивалент которого в C # ??, то нулевой оператор объединения ) и ?[], то оператор доступа к условному элементу null, который выполняет нулевой безопасный вызов индексатора получить аксессуар. Если тип результата доступа к члену - тип ценности, тип результата условного доступа к нулю для этого члена является обнуляемая версия этого типа значения.[14]
В следующем примере извлекается имя автора первой статьи в массиве статей (при условии, что каждая статья имеет Автор член и что у каждого автора есть Имя member) и приводит к ноль если массив ноль, если его первый элемент ноль, если Автор член этой статьи ноль, или если Имя член этого автора ноль. Обратите внимание, что IndexOutOfRangeException по-прежнему выбрасывается, если массив не равен нулю, но пуст (т.е. имеет нулевую длину).
вар имя = статьи?[0]?.Автор?.Имя;Для вызова лямбды требуется обратный вызов? .Invoke (), поскольку нет нулевого условного вызова (Перезвоните?() не допускается).
вар результат = Перезвоните?.Вызвать(аргументы);Visual Basic .NET
Visual Basic 14 и выше имеют ?. (в оператор нулевого условного доступа к члену) и ?() (в оператор нулевого условного индекса), аналогично C #. Они ведут себя так же, как эквивалентные операторы в C #.[15]
Следующий оператор ведет себя идентично приведенному выше примеру C #.
Тусклый имя = статьи?(0)?.Автор?.ИмяГосу
Оператор нулевого безопасного вызова:[16]
вар имя = статья?.автор?.имяНулевой безопасный оператор вызова не требуется для атрибутов класса, объявленных как Gosu Properties:
учебный класс Фу { вар _бар: Нить в качестве Бар}вар фу: Фу = ноль// приведенное ниже значение будет равно null и не вернет исключение NullPointerExceptionвар бар = фу.БарКотлин
Оператор безопасного звонка:[17]
вал имя = статья?.автор?.имяРаку (Perl 6)
Вызов безопасного метода:[18]
мой $ name = $ article.?автор.?имя;PHP
В PHP 8 был принят нулевой безопасный оператор[19]:
$ name = $ article?->автор?->имя;Python
Оператор безопасной навигации не поддерживается в Python. Предлагалось для включения со следующим синтаксисом:[20]
# Предлагаемый синтаксис, еще не являющийся частью языка:имя = статья?.автор?.имяJavaScript
Добавленный в ECMAScript 2020 необязательный оператор цепочки предоставляет способ упростить доступ к значениям через подключенные объекты, когда возможно, что ссылка или функция могут быть неопределенный или же ноль.[21]
const имя = статья?.авторы?.[0]?.имяconst результат = Перезвоните?.()CoffeeScript
Экзистенциальный оператор:[22]
zip = лотерея.ничья?().адрес?.почтовый индексМашинопись
Необязательный оператор цепочки был включен в версию Typescript 3.7:[23]
позволять Икс = фу?.бар?.баз();Кристалл
Кристалл поддерживает пытаться безопасный метод навигации [24]
имя = статья.пытаться &.автор.пытаться &.имяРжавчина
Rust поддерживает ? и пытаться!{} операторов для конструкций, реализующих Пытаться черта[25].
// Предпочтительный метод быстрого возврата ошибокfn write_to_file_question()-> Результат<(),MyError>{позволятьмутфайл=Файл::Создайте("my_best_friends.txt")?;файл.write_all(b "Это список моих лучших друзей.")?;Ok(())}// Предыдущий метод быстрого возврата ошибокfn write_to_file_using_try()-> Результат<(),MyError>{позволятьмутфайл=р#пытаться!(Файл::Создайте("my_best_friends.txt"));р#пытаться!(файл.write_all(b "Это список моих лучших друзей."));Ok(())}Scala
Нулевой безопасный оператор в Scala предоставляется библиотекой Dsl.scala.[26].
вал имя = статья.?.автор.?.имя : @ ?В @ ? аннотация может использоваться для обозначения значения, допускающего значение NULL.
дело учебный класс Дерево(оставили: Дерево @ ? = ноль, верно: Дерево @ ? = ноль, ценить: Нить @ ? = ноль)вал корень: Дерево @ ? = Дерево( оставили = Дерево( оставили = Дерево(ценить = "лево-лево"), верно = Дерево(ценить = "лево право") ), верно = Дерево(ценить = "верно"))Нормальный . в Scala не является нулевым, при выполнении метода на ноль ценить.
а[Исключение нулевого указателя] должен быть брошенный {корень.верно.оставили.верно.ценить // root.right.left - ноль!}Исключения можно избежать, используя ? вместо этого оператор для значения, допускающего значение NULL:
корень.?.верно.?.оставили.?.ценить должен быть(ноль)Все выражение ноль если один из ? выполняется на ноль ценить.
Граница ноль безопасный оператор ? это ближайшее включающее выражение, тип которого аннотируется как @ ?.
("Привет " + ("Мир " + корень.?.верно.?.оставили.?.ценить)) должен быть("Привет, мир, ноль")("Привет " + (("Мир " + корень.?.верно.?.оставили.?.ценить.?): @ ?)) должен быть("Привет, ноль")(("Привет " + ("Мир " + корень.?.верно.?.оставили.?.ценить.?)): @ ?) должен быть(ноль)Clojure
Clojure не имеет истинных операторов в том смысле, в котором его используют другие языки, но поскольку он взаимодействует с Java и должен выполнять навигацию по объектам, когда это происходит, некоторые->[27] макрос может использоваться для безопасной навигации.
(некоторые-> статья .author .имя)Дротик
Оператор условного доступа к члену[8]:
вар имя = статья?.автор?.имяСмотрите также
Рекомендации
- ^ «Оператор безопасной навигации | Руководство разработчика Apex | Разработчики Salesforce». developer.salesforce.com. Получено 2020-10-13.
- ^ «6.1. Оператор безопасного плавания». Получено 2016-01-28.
- ^ «Необязательная цепочка». Получено 2016-01-28.
- ^ «Выпущен Ruby 2.3.0». Получено 2016-01-28.
- ^ «Нулевые условные операторы (C # и Visual Basic)». Получено 2016-01-28.
- ^ «Нулевая безопасность». Получено 2016-01-28.
- ^ "NullSafe: Null-safe со вкусом Kotlin / Groovy? Оператор теперь в Scala". Пользователи Scala. 2018-09-12. Получено 2019-06-03.
- ^ а б «Другие операторы». Экскурсия по языку Дарт. Получено 2020-01-08.
- ^ «Примечания к выпуску Salesforce Winter 21». Salesforce. Получено 2020-10-13.
- ^ «6.1. Оператор безопасного плавания». Получено 2016-01-28.
- ^ «8.5. Безопасный оператор индекса». Получено 2020-09-25.
- ^ «Необязательная цепочка». Получено 2016-01-28.
- ^ «Выпущен Ruby 2.3.0». Получено 2016-01-28.
- ^ «Операторы доступа к членам (справочник по C #)». Документы Microsoft. Microsoft. Получено 29 августа 2019.
- ^ "?. и? () условные операторы NULL (Visual Basic)". Документы Microsoft. Microsoft. Получено 29 августа 2019.
- ^ "Язык программирования Госу". Получено 2018-12-18.
- ^ «Нулевая безопасность». Получено 2016-01-28.
- ^ «Операторы Раку». Получено 2016-06-28.
- ^ "PHP: rfc: nullsafe_operator". wiki.php.net. Получено 2020-10-01.
- ^ «PEP 505 - Неизвестные операторы». Получено 2018-08-27.
- ^ https://tc39.es/proposal-optional-chaining/
- ^ "Экзистенциальный оператор". Получено 2017-06-15.
- ^ «Машинопись 3.7». Получено 2019-11-06.
- ^ «Crystal API: объект № попробовать».
- ^ "Trait std :: ops :: Try". Получено 2019-02-26.
- ^ Фреймворк для создания встроенных доменно-ориентированных языков в Scala: ThoughtWorksInc / Dsl.scala, ThoughtWorks Inc., 03.06.2019, получено 2019-06-03
- ^ «Руководство по макросам потоков». Получено 2019-06-07.
внешняя ссылка
- PEP 505, обсуждая возможность безопасных операторов навигации для Python