Нулевой оператор объединения
Оператор объединения нулей — это бинарный оператор , который является частью синтаксиса базового условного выражения в нескольких языках программирования , например (в алфавитном порядке): C# [1] начиная с версии 2.0, [2] Дарт [3] начиная с версии 1.12.0, [4] PHP начиная с версии 7.0.0, [5] Perl, начиная с версии 5.10, как логически определенное-или , [6] PowerShell начиная с 7.0.0, [7] и Свифт [8] как оператор объединения нулей .
Хотя его поведение различается в разных реализациях, оператор объединения значений NULL обычно возвращает результат своего крайнего левого операнда, если он существует и не имеет значения null , а в противном случае возвращает самый правый операнд. Такое поведение позволяет определить значение по умолчанию в тех случаях, когда более конкретное значение недоступно.
В отличие от троичного условного оператора if, используемого как x ? x : y
, но, как и бинарный оператор Элвиса, используемый как x ?: y
, оператор объединения нулей является бинарным оператором и, таким образом, вычисляет свои операнды не более одного раза, что важно, если вычисление x
имеет побочные эффекты .
Примеры по языкам
[ редактировать ]Раковины типа Борна
[ редактировать ]В оболочке Bourne (и ее производных): «Если параметр не установлен или равен нулю, заменяется расширение слова значение параметра »: . В противном случае заменяется [9]
#supplied_title='supplied title' # Uncomment this line to use the supplied title
title=${supplied_title:-'Default title'}
echo "$title" # prints: Default title
С#
[ редактировать ]В C# оператор объединения нулей ??
.
Чаще всего его используют для упрощения выражений следующим образом:
possiblyNullValue ?? valueIfNull
Например, если кто-то хочет реализовать некоторый код C#, чтобы дать странице заголовок по умолчанию, если его нет, можно использовать следующий оператор:
string pageTitle = suppliedTitle ?? "Default Title";
вместо более многословного
string pageTitle = (suppliedTitle != null) ? suppliedTitle : "Default Title";
или
string pageTitle;
if (suppliedTitle != null)
{
pageTitle = suppliedTitle;
}
else
{
pageTitle = "Default Title";
}
В результате использования трех форм одно и то же значение сохраняется в переменной с именем pageTitle
.
suppliedTitle
упоминается только один раз при использовании ??
оператор и дважды в двух других примерах кода.
Оператор также можно использовать несколько раз в одном выражении:
return some_Value ?? some_Value2 ?? some_Value3;
Как только номеру присвоено ненулевое значение или оно достигает конечного значения (которое может быть или не быть нулевым), выражение завершается.
Если, например, переменную следует изменить на другое значение, если ее значение равно нулю, поскольку C# 8.0 ??=
Можно использовать оператор присваивания нулевого объединения:
some_Value ??= some_Value2;
Это более краткая версия:
some_Value = some_Value ?? some_Value2;
В сочетании с оператором с нулевым условием ?.
или оператор доступа к элементу с нулевым условием ?[]
оператор объединения значений NULL можно использовать для предоставления значения по умолчанию, если объект или член объекта имеет значение NULL. Например, следующая команда вернет заголовок по умолчанию, если либо page
объект имеет значение null или page
не является нулевым, но его Title
имущество это:
string pageTitle = page?.Title ?? "Default Title";
CFML
[ редактировать ]Начиная с ColdFusion 11, [10] Рейло 4.1, [11] CFML поддерживает оператор объединения нулей как разновидность тернарного оператора. ?:
. Он функционально и синтаксически эквивалентен своему аналогу на C#, указанному выше. Пример:
possiblyNullValue ?: valueIfNull
Ф#
[ редактировать ]Значение null обычно не используется в F# для значений или переменных. [12] Однако нулевые значения могут появляться, например, при вызове кода F# из C#.
В F# нет встроенного оператора объединения значений NULL, но при необходимости его можно определить как собственный оператор: [13]
let (|?) lhs rhs = (if lhs = null then rhs else lhs)
Затем этот пользовательский оператор можно применить в соответствии со встроенным оператором объединения значений NULL в C#:
let pageTitle = suppliedTitle |? "Default Title"
Фримаркер
[ редактировать ]Отсутствие значений в Apache FreeMarker обычно приводит к исключениям. Однако можно обрабатывать как отсутствующие, так и нулевые значения с помощью необязательного значения по умолчанию: [14]
${missingVariable!"defaultValue"}
или, чтобы оставить вывод пустым:
${missingVariable!}
Хаскелл
[ редактировать ]Типы в Haskell вообще не могут быть нулевыми. Представление вычислений, которые могут возвращать или не возвращать значимый результат, представлено универсальным типом Maybe, определенным в стандартной библиотеке. [15] как
data Maybe a = Nothing | Just a
Оператор объединения значений null заменяет нулевые указатели значением по умолчанию. Эквивалент Haskell — это способ извлечения значения из Maybe путем предоставления значения по умолчанию. Это функция из Maybe.
fromMaybe :: a -> Maybe a -> a
fromMaybe defaultValue x =
case x of
Nothing -> defaultValue
Just value -> value
Ниже приведены некоторые примеры использования.
fromMaybe 0 (Just 3) -- returns 3
fromMaybe "" Nothing -- returns ""
JavaScript
[ редактировать ] JavaScript : Ближайший оператор ??
, «нулевой оператор объединения», который был добавлен в стандарт в ECMAScript . 11-м издании [16] В более ранних версиях его можно было использовать через плагин Babel и в TypeScript . Он оценивает свой левый операнд и, если значение результата не является «нулевым» ( null
или undefined
), принимает это значение как результат; в противном случае он оценивает правый операнд и принимает полученное значение в качестве результата.
В следующем примере a
будет присвоено значение b
если значение b
не null
или undefined
, в противном случае ему будет присвоено 3.
const a = b ?? 3;
Перед нулевым оператором объединения программисты использовали бы логический оператор ИЛИ ( ||
). Но где ??
ищет специально для null
или undefined
, ||
оператор ищет любое ложное значение: null
, undefined
, ""
, 0
, NaN
, и, конечно, false
.
В следующем примере a
будет присвоено значение b
если значение b
является правдивым , в противном случае ему будет присвоено 3.
const a = b || 3;
Котлин
[ редактировать ]Котлин использует ?:
оператор. [17] Это необычный выбор символа, учитывая, что ?:
обычно используется для оператора Элвиса , а не для объединения значений null, но он был вдохновлен Groovy (языком программирования), где значение null считается ложным.
val title = suppliedTitle ?: "Default title"
Цель-C
[ редактировать ]В Obj-C нулевой оператор объединения равен ?:
. Его можно использовать для предоставления значения по умолчанию для нулевых ссылок:
id value = valueThatMightBeNil ?: valueIfNil;
Это то же самое, что написать
id value = valueThatMightBeNil ? valueThatMightBeNil : valueIfNil;
Перл
[ редактировать ]В Perl (начиная с версии 5.10) оператор //
и эквивалентный код Perl:
$possibly_null_value // $value_if_null
Возможно_null_value оценивается как нулевое или ненулевое (в терминологии Perl, неопределенное или определенное ). На основе оценки выражение возвращает либо value_if_null , если возможно_null_value равно нулю, либо возможно_null_value в противном случае. В отсутствие побочных эффектов это похоже на то, как работают тернарные операторы ( ?:
операторы) работают на языках, которые их поддерживают. Приведенный выше код Perl эквивалентен использованию приведенного ниже тернарного оператора:
defined($possibly_null_value) ? $possibly_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.0 [18] оператор объединения нулей с ??
синтаксис. Это проверяет строго NULL или несуществующую переменную/индекс/свойство массива. В этом отношении он действует аналогично PHP. isset()
псевдофункция:
$name = $request->input['name'] ?? $request->query['name'] ?? 'default name';
/* Equivalent to */
if (isset($request->input['name'])) {
$name = $request->input['name'];
} elseif (isset($request->query['name'])) {
$name = $request->query['name'];
} else {
$name = 'default name';
}
$user = $this->getUser() ?? $this->createGuestUser();
/* Equivalent to */
$user = $this->getUser();
if ($user === null) {
$user = $this->createGuestUser();
}
$pageTitle = $title ?? 'Default Title';
/* Equivalent to */
$pageTitle = isset($title) ? $title : 'Default Title';
В версии PHP 7.4 будет добавлен оператор присваивания нулевого объединения с ??=
синтаксис: [19]
// The following lines are doing the same
$this->request->data['comments']['user_id'] = $this->request->data['comments']['user_id'] ?? 'value';
// Instead of repeating variables with long names, the equal coalesce operator is used
$this->request->data['comments']['user_id'] ??= 'value';
Питон
[ редактировать ]В Python нет оператора объединения нулей. Его функциональность можно имитировать с помощью условного выражения:
now() if time is None else time
Было предложение добавить операторы нулевого типа в Python 3.8, но это предложение было отложено. [20]
Сопутствующая функциональность
[ редактировать ]Python or
Оператор обеспечивает похожее, но другое поведение. Разница в том, что or
также возвращает правый термин, если первый термин определен, но имеет значение, равное False
в логическом контексте:
42 or "something" # returns 42
0 or "something" # returns "something"
False or "something" # returns "something"
"" or "something" # returns "something"
[] or "something" # returns "something"
dict() or "something" # returns "something"
None or "something" # returns "something"
Настоящий оператор объединения нулей вернет только "something"
в самом последнем случае и вернет ложные значения ( 0
, False
, ""
, []
, dict()
) в других примерах.
PowerShell
[ редактировать ]Начиная с PowerShell 7, ??
Оператор объединения null обеспечивает эту функциональность. [7]
$myVar = $null
$x = $myVar ?? "something" # assigns "something"
Р
[ редактировать ]Начиная с версии R 4.4.0 %||%
Оператор включен в базу R (ранее это была функция некоторых пакетов, таких как rlang ).
Руби
[ редактировать ]В Ruby нет оператора объединения нулей, но его ||
и ||=
операторы работают одинаково, за исключением логических значений. Условные выражения Ruby имеют только два значения, подобных false: false
и nil
(где «ложь» — это не то же самое, что 0). Руби ||
Оператор оценивает свой первый операнд, когда он соответствует истине. Для сравнения, Perl/Python/Javascript, которые также имеют последнее свойство, имеют другие значения, подобные false (0 и пустая строка), что делает ||
во многих других случаях отличаются от оператора объединения нулей (числа и строки являются двумя наиболее часто используемыми типами данных). Именно это заставило Perl/Python/Javascript добавить отдельный оператор, а Ruby — нет.
Ржавчина
[ редактировать ]Пока нет null
в Rust . теговые объединения используются с той же целью Например, Result<T, E>
или Option<T>
.
Любой тип, реализующий признак Try, может быть развернут.
unwrap_or()
служит той же цели, что и оператор объединения нулей в других языках. Альтернативно, unwrap_or_else()
может использоваться для использования результата функции в качестве значения по умолчанию.
// Option
// An Option can be either Some(value) or None
Some(1).unwrap_or(0); // evaluates to 1
None.unwrap_or(0); // evaluates to 0
None.unwrap_or_else(get_default); // evaluates to the result of calling the function get_default
// Result
// A Result can be either Ok(value) or Err(error)
Ok(1).unwrap_or(0); // evaluates to 1
Err("oh no").unwrap_or(1); // evaluates to 1
SQL
[ редактировать ]В Oracle PL/SQL функция NVL () обеспечивает тот же результат:
NVL(possibly_null_value, 'value if null');
В SQL Server / Transact-SQL есть функция ISNULL, которая соответствует тому же шаблону прототипа:
ISNULL(possibly_null_value, 'value if null');
Следует обратить внимание на то, чтобы не путать ISNULL с IS NULL – последний служит для оценки того, определено ли некоторое содержимое как NULL или нет.
Стандарт ANSI SQL-92 включает функцию COALESCE, реализованную в Oracle . [21] SQL-сервер , [22] PostgreSQL , [23] SQLite [24] и MySQL . [25] Функция COALESCE возвращает первый аргумент, который не равен нулю. Если все условия имеют значение NULL, возвращается значение NULL.
COALESCE(possibly_null_value[, possibly_null_value, ...]);
Разница между ISNULL и COALESCE заключается в том, что тип, возвращаемый ISNULL, является типом самого левого значения, а COALESCE возвращает тип первого значения, отличного от NULL.
Быстрый
[ редактировать ]В Swift оператор объединения nil ??
. Он используется для предоставления значения по умолчанию при развертывании необязательного типа :
optionalValue ?? valueIfNil
Например, если кто-то хочет реализовать некоторый код Swift, чтобы дать странице заголовок по умолчанию, если его нет, можно использовать следующий оператор:
var suppliedTitle: String? = ...
var pageTitle: String = suppliedTitle ?? "Default Title"
вместо более многословного
var pageTitle: String = (suppliedTitle != nil) ? suppliedTitle! : "Default Title";
VB.NET
[ редактировать ]В VB.NET If
[26] оператор/ключевое слово обеспечивает нулевой эффект оператора объединения.
Dim pageTitle = If(suppliedTitle, "Default Title")
это более краткий способ использования его вариации
Dim pageTitle = If(suppliedTitle <> Nothing, suppliedTitle, "Default Title")
См. также
[ редактировать ]- ?: ( условно )
- Оператор Элвиса (двоичный ?:)
- Условный оператор с нулевым значением
- Оператор (компьютерное программирование)
Ссылки
[ редактировать ]- ^ «Операторы ?? и ??= — операторы объединения нулей» . Learn.microsoft.com .
- ^ «ECMA-334, 3-е издание, июнь 2005 г.» (PDF) . ecma-international.org . Экма Интернешнл . Июнь 2005. с. 63.
- ^ «Условное выражение» .
- ^ «Журнал изменений Dart SDK, 1.12.0» . github.com . 31 августа 2015 г.
- ^ «PHP: Архив новостей — 2015» . php.net .
- ^ «perlop — perldoc.perl.org» . perldoc.perl.org .
- ^ Jump up to: а б «PowerShell 7, предварительная версия 5» . PowerShell . 2019-10-23 . Проверено 15 февраля 2020 г.
- ^ «Язык программирования Swift (Swift 5): базовые операторы: оператор объединения с нулем» . docs.swift.org .
- ^ «Справочная страница Bash» .
- ^ «Оператор Элвиса» . wikidocs.adobe.com .
- ^ «[RAILO-2195] добавить поддержку оператора Элвиса» . Трекер проблем JBoss .
- ^ Картермп. «Нулевые значения (F#)» . msdn.microsoft.com .
- ^ Картермп. «Перегрузка оператора (F#)» . msdn.microsoft.com .
- ^ «Выражения» . Руководство по Apache FreeMarker .
- ^ «Хакинг» . Проверено 10 июля 2015 г.
- ^ «Спецификация языка ECMAScript 2020» . Экма Интернешнл . Июнь 2020.
- ^ «Нулевая безопасность» . .
- ^ «PHP: rfc:isset_ternary» . Проверено 16 декабря 2014 г.
- ^ Кочак, Мидори. «PHP RFC: Оператор присваивания нулевого объединения» . PHP.net . Проверено 20 июля 2017 г.
- ^ «PEP 505 — Неосведомленные операторы» .
- ^ «Справочник по языку баз данных SQL» . docs.oracle.com .
- ^ «КОАЛЕСЦИЯ (SQL Server Compact)» . technet.microsoft.com .
- ^ «PostgreSQL: Документация: 9.1: Условные выражения» . www.postgresql.org . 27 октября 2016 г.
- ^ «Язык запросов SQLite: основные функции» . www.sqlite.org .
- ^ «MySQL :: Справочное руководство MySQL 5.5 :: 12.3.2 Функции и операторы сравнения» . dev.mysql.com .
- ^ дотнет-бот. «Оператор If (Visual Basic)» . docs.microsoft.com .