Оператор нулевой коалесцирующий ( так называемый логический Defined-Или оператор в Perl ) является бинарным оператором , который является частью синтаксиса для основного условного выражения в нескольких языках программирования , включая C # , [1] PowerShell в версии 7.0.0, [ 2] Perl версии 5.10, [3] Swift , [4] и PHP 7.0.0. [5] Хотя его поведение различается в зависимости от реализации, оператор объединения с нулевым значением обычно возвращает результат своего крайнего левого операнда, если он существует и не являетсяnull , а в противном случае возвращает самый правый операнд. Такое поведение позволяет определить значение по умолчанию для случаев, когда более конкретное значение недоступно.
В отличие от тернарного условного оператора if, используемого как x ? x : y
, но подобно бинарному оператору Элвиса, используемому как x ?: y
, нулевой оператор объединения является двоичным оператором и, таким образом, оценивает свои операнды не более одного раза, что важно, если оценка x
имеет побочные эффекты .
Примеры по языкам
Баш
В Bash «Если параметр не установлен или равен нулю, подставляется расширение слова . В противном случае подставляется значение параметра »: [6]
# provided_title = 'provided title' # Раскомментируйте эту строку, чтобы использовать предоставленный заголовок title = $ { provided_title : - 'Default title' } echo " $ title " # выводит: заголовок по умолчанию
C #
В C # нулевым оператором объединения является ??
.
Чаще всего используется для упрощения выражений следующим образом:
возможноNullValue ?? valueIfNull
Например, если кто-то хочет реализовать некоторый код C #, чтобы дать странице заголовок по умолчанию, если его нет, можно использовать следующий оператор:
Строка PAGETITLE = suppliedTitle ?? "Заголовок по умолчанию" ;
вместо более подробного
строка pageTitle = ( providedTitle ! = null ) ? providedTitle : "Заголовок по умолчанию" ;
или же
строка pageTitle ;если ( suppliedTitle ! = NULL ) { PAGETITLE = suppliedTitle ; } else { pageTitle = "Заголовок по умолчанию" ; }
Три формы приводят к тому, что одно и то же значение сохраняется в названной переменной pageTitle
.
Обратите внимание, что suppliedTitle
при использовании ??
оператора на него ссылаются только один раз , а в двух других примерах кода - дважды.
Оператор также может использоваться несколько раз в одном выражении:
вернуть some_Value ?? some_Value2 ?? some_Value3 ;
Как только число присваивается ненулевое значение или оно достигает конечного значения (которое может быть или не быть нулевым), выражение завершается.
Если, например, переменная должна быть изменена на другое значение, если ее значение оценивается как null, начиная с C # 8.0 ??=
можно использовать оператор присваивания объединения null:
some_Value ?? = some_Value2 ;
Это более краткая версия:
some_Value = some_Value ?? some_Value2 ;
В сочетании с условным оператором ?.
null или оператором доступа ?[]
к условному элементу null оператор объединения null может использоваться для предоставления значения по умолчанию, если объект или член объекта имеет значение null. Например, следующее будет возвращать заголовок по умолчанию, если page
объект имеет значение NULL или page
не имеет значения NULL, но его Title
свойство равно:
строка pageTitle = page ?. Название ?? "Заголовок по умолчанию" ;
CFML
Начиная с ColdFusion 11, [7] Railo 4.1, [8] CFML поддерживает нулевой оператор объединения как разновидность тернарного оператора ?:
. Он функционально и синтаксически эквивалентен своему аналогу на C #, описанному выше. Пример:
возможноNullValue?: valueIfNull
F #
Нулевое значение обычно не используется в F # для значений или переменных. [9] Однако нулевые значения могут появиться, например, когда код F # вызывается из C #.
F # не имеет встроенного оператора объединения NULL, но при необходимости его можно определить как настраиваемый оператор: [10]
let (|?) lhs rhs = ( если lhs = null, то rhs else lhs )
Затем этот настраиваемый оператор можно применить в соответствии со встроенным в C # оператором объединения с нулевым значением:
пусть PAGETITLE = suppliedTitle |? "Заголовок по умолчанию"
Freemarker
Отсутствующие значения в Apache FreeMarker обычно вызывают исключения. Однако можно обрабатывать как отсутствующие, так и нулевые значения, используя необязательное значение по умолчанию: [11]
$ { missingVariable ! "defaultValue" }
или оставить поле пустым:
$ { missingVariable ! }
Haskell
Типы в Haskell, как правило, не могут быть нулевыми. Представление вычислений, которые могут возвращать или не возвращать значимый результат, представлено универсальным типом Maybe, определенным в стандартной библиотеке [12] как
данные Может = Nothing | Просто
Оператор объединения null заменяет нулевые указатели значением по умолчанию. Эквивалент в Haskell - это способ извлечения значения из объекта Maybe путем предоставления значения по умолчанию. Это функция от Может быть.
fromMaybe :: a -> Может быть a -> a fromMaybe d x = case x of { Ничего -> d ; Просто v -> v }
Ниже приводится несколько примеров использования.
fromMaybe 0 ( Just 3 ) - возвращает 3 fromMaybe "" ( Nothing ) - возвращает ""
JavaScript
Ближайшим оператором JavaScript является ??
«нулевой оператор объединения», который был добавлен к стандарту в 11- й редакции ECMAScript . [13] В более ранних версиях его можно было использовать через плагин Babel и в TypeScript . Он вычисляет свой левый операнд и, если значение результата не равно нулю ( или ), принимает это значение в качестве результата; в противном случае он оценивает правый операнд и принимает полученное значение в качестве результата.null
undefined
В следующем примере a
будет присвоено значение, b
если значение b
не равно null
или undefined
, в противном случае ему будет присвоено 3.
const a = b ?? 3 ;
До появления нулевого оператора объединения программисты использовали бы логический оператор ИЛИ ( ||
). Но где ??
выглядит специально для null
или undefined
, то ||
оператор выглядит для любого falsy значения: null
, undefined
, ""
, 0
, NaN
, и, конечно же , false
.
В следующем примере, a
будет присвоено значение , b
если значение b
является truthy , в противном случае он будет присвоен 3.
const a = b || 3 ;
Котлин
Котлин использует ?:
оператор. [14] Это необычный выбор символа, поскольку ?:
он обычно используется для оператора Элвиса , а не для объединения с нулевым значением, но он был вдохновлен Groovy (языком программирования), где null считается ложным.
val title = providedTitle ?: "Заголовок по умолчанию"
Цель-C
В Obj-C оператор объединения nil равен ?:
. Его можно использовать для предоставления значения по умолчанию для нулевых ссылок:
id value = valueThatMightBeNil ?: valueIfNil ;
Это то же самое, что писать
id value = valueThatMightBeNil ? valueThatMightBeNil : valueIfNil ;
Perl
В Perl (начиная с версии 5.10) оператор //
и эквивалентный код Perl:
$ возможно_null_value // $ значение_если_null
Возможно, пустое_значение оценивается как нулевое или ненулевое (в терминологии Perl - неопределенное или определенное ). На основе оценки выражение возвращает либо value_if_null, когда возможно_null_value равно нулю, либо возможно_null_value в противном случае. При отсутствии побочных эффектов это похоже на то, как тернарные операторы ( ?:
операторы) работают в языках, которые их поддерживают. Приведенный выше код Perl эквивалентен использованию тернарного оператора ниже:
определено ( $ возможно_null_value ) ? $ possible_null_value : $ value_if_null
Чаще всего этот оператор используется для минимизации объема кода, используемого для простой нулевой проверки.
Perl дополнительно имеет //=
оператор присваивания, где
$ a // = $ b
в значительной степени эквивалентен:
$ a = $ a // $ b
Этот оператор отличается от старых операторов Perl ||
и ||=
тем, что он учитывает определенность, а не истину. Таким образом, они по-разному ведут себя с ложными, но определенными значениями, такими как 0 или '' (строка нулевой длины):
$ a = 0 ; $ b = 1 ; $ c = $ a // $ b ; # $ c = 0 $ c = $ a || $ b ; # $ c = 1
PHP
PHP 7 представил [15] оператор объединения нуля с ??
синтаксисом. Это строго проверяет наличие NULL или несуществующего индекса / свойства переменной / массива. В этом отношении он действует аналогично псевдофункции PHP isset()
:
$ name = $ request -> input [ 'name' ] ?? $ request -> query [ 'name' ] ?? 'имя по умолчанию' ;/ * Эквивалентно * /if ( isset ( $ request -> input [ 'name' ])) { $ name = $ request -> input [ 'имя' ]; } elseif ( isset ( $ request -> query [ 'name' ])) { $ name = $ request -> query [ 'имя' ]; } else { $ name = 'имя по умолчанию' ; }
$ user = $ this -> getUser () ?? $ this -> createGuestUser ();/ * Эквивалентно * /$ user = $ this -> getUser ();if ( null === $ user ) { $ user = $ this -> createGuestUser (); }
$ pageTitle = $ title ?? 'Заголовок по умолчанию' ;/ * Эквивалентно * /$ pageTitle = isset ( $ title ) ? $ title : 'Заголовок по умолчанию' ;
Версия PHP 7.4 добавит оператор присваивания Null Coalescing с ??=
синтаксисом: [16]
// Следующие строки делают то же самое $ this -> request -> data [ 'comments' ] [ 'user_id' ] = $ this -> request -> data [ 'comments' ] [ 'user_id' ] ?? 'значение' ; // Вместо повторения переменных с длинными именами используется оператор равного объединения $ this -> request -> data [ 'comments' ] [ 'user_id' ] ?? = 'value' ;
Python
Python это не есть оператор нулевой коалесцирующий. Его функциональность можно имитировать с помощью условного выражения:
now (), если время - None else time
Было предложение добавить в Python 3.8 операторы объединения с нулевым типом, но это предложение было отложено. [17]
Связанная функциональность
or
Оператор Python обеспечивает похожее, но другое поведение. Разница в том, что or
также возвращает правый термин, если первый термин определен, но имеет значение, которое оценивается False
в логическом контексте:
42 or "something" # возвращает 42 0 или "something" # возвращает "something" False или "something" # возвращает "something" "" или "something" # возвращает "something" None или "something" # возвращает "something"
Истинный оператор нулевых коалесцирующий будет возвращать только "something"
в самом последнем случае, и будет возвращать ложный иш значения ( 0
, False
, ""
) и в других примерах.
PowerShell
??
Оператор нуль коалесцирующий обеспечивает такую функциональность. [2]
$ myVar = $ null $ x = $ myVar ?? "something" # присваивает "something"
Ржавчина
Хотя null
в Rust их нет , помеченные объединения используются для той же цели. Например, Result
или Option
.
unwrap_or_else()
служит той же цели, что и оператор объединения с нулевым значением в других языках. Если вычисление значения по умолчанию не имеет побочных эффектов, unwrap_or()
может использоваться как более краткий (и без оптимизаций, более эффективный) выбор.
let parsed_numbers : Vec < _ > = [ "1" , "не число" , "3" ] . iter () . map ( | n | n . parse (). unwrap_or_else ( | _ | std :: i64 :: MIN )) . собирать ();// выводит "[1, -9223372036854775808, 3]" println! ( "{:?}" , проанализированные_числа );
SQL
В Oracle, PL / SQL , то NVL () функция обеспечивает тот же результат:
NVL ( возможно_null_value , 'значение, если ноль' );
В SQL Server / Transact-SQL есть функция ISNULL, которая следует тому же шаблону прототипа:
ISNULL ( возможно_null_value , 'значение, если ноль ' );
Следует обратить внимание на то, чтобы не путать ISNULL с IS NULL - последнее служит для оценки того, определено ли какое-либо содержимое как NULL или нет.
Стандарт ANSI SQL-92 включает функцию COALESCE, реализованную в Oracle , [18] SQL Server , [19] PostgreSQL , [20] SQLite [21] и MySQL . [22] Функция COALESCE возвращает первый аргумент, который не является нулевым. Если все условия равны нулю, возвращается ноль.
COALESCE ( возможно_null_value [, возможно_null_value , ... ]);
Быстрый
В Swift оператор объединения nil равен ??
. Он используется для предоставления значения по умолчанию при развертывании необязательного типа :
optionalValue ?? valueIfNil
Например, если кто-то хочет реализовать какой-то Swift-код, чтобы дать странице заголовок по умолчанию, если его нет, можно использовать следующий оператор:
var providedTitle : String ? = ... var pageTitle : String = providedTitle ?? "Заголовок по умолчанию"
вместо более подробного
var pageTitle : String = ( providedTitle ! = nil ) ? providedTitle ! : "Заголовок по умолчанию" ;
VB.NET
В VB.NET If
[23] оператор / ключевое слово достигает нуль коалесцирующий эффект оператора.
Dim pageTitle = If ( providedTitle , «Заголовок по умолчанию» )
что является более кратким способом использования его вариации
Dim pageTitle = If ( providedTitle <> Nothing , providedTitle , "Заголовок по умолчанию" )
Смотрите также
- ?: ( условно )
- Оператор Элвиса (двоичный? :)
- Оператор (программирование)
Рекомендации
- ^ Билл Вагнер. «Оператор (Справочник по C #)» . msdn.microsoft.com .
- ^ а б «PowerShell 7, предварительная версия 5» . PowerShell . 2019-10-23 . Проверено 15 февраля 2020 .
- ^ "perlop - perldoc.perl.org" . perldoc.perl.org .
- ^ «Язык программирования Swift (Swift 4): основные операторы» . developer.apple.com .
- ^ «PHP: Архив новостей - 2015» . php.net .
- ^ "Страница руководства Bash" .
- ^ «Оператор Элвиса» . wikidocs.adobe.com .
- ^ «[RAILO-2195] добавить поддержку оператора Элвиса - JBoss Issue Tracker» . issues.jboss.org .
- ^ картермп. «Нулевые значения (F #)» . msdn.microsoft.com .
- ^ картермп. «Перегрузка оператора (F #)» . msdn.microsoft.com .
- ^ «Выражения» . Руководство по Apache FreeMarker .
- ^ «Взлом» . Проверено 10 июля 2015 года .
- ^ «Спецификация языка ECMAScript 2020» . Ecma International . Июнь 2020.
- ^ «Нулевая безопасность» ..
- ^ «PHP: rfc: isset_ternary» . Проверено 16 декабря 2014 .
- ^ Коджак, Мидори. «PHP RFC: оператор присваивания слияния нулей» . PHP.net . Проверено 20 июля 2017 года .
- ^ https://www.python.org/dev/peps/pep-0505/
- ^ «Справочник по языку SQL для баз данных» . docs.oracle.com .
- ^ «COALESCE (SQL Server Compact)» . technet.microsoft.com .
- ^ «PostgreSQL: Документация: 9.1: Условные выражения» . www.postgresql.org .
- ^ «Язык запросов SQLite: основные функции» . www.sqlite.org .
- ^ "Справочное руководство MySQL :: MySQL 5.5 :: 12.3.2 Функции и операторы сравнения" . dev.mysql.com .
- ^ дотнет-бот. «Оператор If (Visual Basic)» . docs.microsoft.com .