Оператор безопасной навигации - 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