Null coalescing operator

The null coalescing operator (called the Logical Defined-Or operator in Perl) is a binary operator that is part of the syntax for a basic conditional expression in several programming languages, including C#,[1] Perl as of version 5.10,[2] Swift,[3] and PHP 7.0.0.[4] While its behavior differs between implementations, the null coalescing operator generally returns the result of its left-most operand if it exists and is not null, and otherwise returns the right-most operand. This behavior allows a default value to be defined for cases where a more specific value is not available.

In contrast to the ternary conditional if operator used as x ? x : y, but like the binary Elvis operator used as x ?: y, the null coalescing operator is a binary operator and thus evaluates its operands at most once, which is significant if the evaluation of x has side-effects.

Examples by languages

Bash

In Bash "If parameter is unset or null, the expansion of word is substituted. Otherwise, the value of parameter is substituted":[5]

#supplied_title='supplied title' # uncomment this line to use the supplied title
TITLE=${supplied_title:-'Default title'}
echo $TITLE # prints: Default title

C#

In C#, the null coalescing operator is ??. It is most often used to simplify null expressions as follows:

possiblyNullValue ?? valueIfNull

For example, if one wishes to implement some C# code to give a page a default title if none is present, one may use the following statement:

string pageTitle = suppliedTitle ?? "Default Title";

instead of the more verbose

string pageTitle = (suppliedTitle != null) ? suppliedTitle : "Default Title";

or

string pageTitle;

if (suppliedTitle != null)
    pageTitle = suppliedTitle;
else
    pageTitle = "Default Title";

The three forms are logically equivalent.

The operator can also be used multiple times in the same expression:

return some_Value ?? some_Value2 ?? some_Value3;

Once a non-null value is assigned to number, or it reaches the final value (which may or may not be null), the expression is completed.

CFML

As of ColdFusion 11,[6] Railo 4.1,[7] CFML supports the null coalescing operator as a variation of the ternary operator, ?:. It is functionally and syntactically equivalent to its C# counterpart, above. Example:

possiblyNullValue ?: valueIfNull

Clojure

Clojure's or macro works similarly.

(or page-title "Default title")

You can also chain values.

(or x y z) ;; returns first not-nil value or nil

F#

The null value is not normally used in F# for values or variables.[8] However null values can appear for example when F# code is called from C#.

F# does not have a built-in null coalescing operator but one can be defined as required as a custom operator:[9]

let (|?) lhs rhs = (if lhs = null then rhs else lhs)

This custom operator can then be applied as per C#'s built-in null coalescing operator:

let pageTitle = suppliedTitle |? "Default Title"

Freemarker

Missing values will normally cause exceptions. However, both missing and null values can be handled, with an optional default value:[10]

${missingVariable!"defaultValue"}

or, to leave the output blank:

${missingVariable!}

Haskell

Types in Haskell can in general not be null. Representation of computations that may or may not return a meaningful result is represented by the generic Maybe type, defined in the standard library[11] as

data Maybe a = Nothing | Just a

The null coalescing operator replaces null pointers with a default value. The Haskell equivalent is a way of extracting a value from a Maybe by supplying a default value. This is the function fromMaybe.

fromMaybe     :: a -> Maybe a -> a
fromMaybe d x = case x of {Nothing -> d;Just v  -> v}

Some example usage follows.

fromMaybe 0 (Just 3) -- returns 3
fromMaybe "" (Nothing) -- returns ""

Kotlin

Kotlin uses the '?:' operator.[12] This is an unusual choice of symbol, given that ?: is typically used for the Elvis operator, not null coalescing, but it was inspired by Groovy (programming language) where null is considered false.

val title = suppliedTitle ?: "Default title"

Objective-C

In Obj-C, the nil coalescing operator is ?:. It can be used to provide a default for nil references:

id value = valueThatMightBeNil ?: valueIfNil;

This is the same as writing

id value = valueThatMightBeNil ? valueThatMightBeNil : valueIfNil;

Perl

In Perl (starting with version 5.10), the operator is // and the equivalent Perl code is:

$possibly_null_value // $value_if_null

The possibly_null_value is evaluated as null or not-null (in Perl terminology, undefined or defined). On the basis of the evaluation, the expression returns either value_if_null when possibly_null_value is null, or possibly_null_value otherwise. In the absence of side-effects this is similar to the way ternary operators (?: statements) work in languages that support them. The above Perl code is equivalent to the use of the ternary operator below:

defined($possibly_null_value) ? $possibly_null_value : $value_if_null

This operator's most common usage is to minimize the amount of code used for a simple null check.

Perl additionally has a //= assignment operator, where

$a //= $b

is largely equivalent to:

$a = $a // $b

This operator differs from Perl's older || and ||= operators in that it considers definedness, not truth. Thus they behave differently on values that are false but defined, such as 0 or '' (a zero-length string):

$a = 0;
$b = 1;
$c = $a // $b;  # $c = 0
$c = $a || $b;  # $c = 1

PHP

PHP 7 has introduced[13] a null-coalescing operator with the ?? syntax. This checks strictly for NULL or a non-existent variable/array index/property. In this respect, it acts similarly to PHP's isset() pseudo-function:

$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 (null === $user) {
    $user = $this->createGuestUser();
}
$pageTitle = $title ?? 'Default Title';

/* Equivalent to */

$pageTitle = isset($title) ? $title : 'Default Title';

A future version of PHP will add the Null Coalescing Assignment Operator with the ??= syntax:[14]

// 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

The or operator provides this functionality. [15]

other = s or "some default value"

Note that the or operator does not return only True or False. Instead, it returns the first operand if the first operand evaluates to true, and it returns the second operand if the first operand evaluates to false.

In this case, the expression x or y returns x if it is True or evaluates to true when converted to boolean. Otherwise, it returns y. For most cases, this will serve for the very same purpose of C♯'s null-coalescing operator, but keep in mind:

42    or "something"    # returns 42
0     or "something"    # returns "something"
None  or "something"    # returns "something"
False or "something"    # returns "something"
""    or "something"    # returns "something"

There is a proposal to add a new operator or operators to correctly handle this in Python 3.8.[16]

Scheme

In Scheme, "boolean false" and "null" are represented by the same value, written as #f. Furthermore, #f is the only value in Scheme that is treated as false by boolean operators, unlike some other languages, in which values like 0, the empty string, and the empty list may function as false. The boolean 'or' operation, written as (or x y), returns x if it is not false, otherwise it returns y. Thus, in Scheme, there is no need for a separate "null coalescing operator", because the or operator serves that purpose.

SQL

In Oracle's PL/SQL, the NVL() function provides the same outcome:

NVL(possibly_null_value, 'value if null');

In SQL Server/Transact-SQL there is the ISNULL function that follows the same prototype pattern:

ISNULL(possibly_null_value, 'value if null');

Attention should be taken to not confuse ISNULL with IS NULL – the latter serves to evaluate whether some contents are defined to be NULL or not.

The ANSI SQL-92 standard includes the COALESCE function implemented in Oracle,[17] SQL Server,[18] PostgreSQL,[19] SQLite[20] and MySQL.[21] The COALESCE function returns the first argument that is not null. If all terms are null, returns null.

COALESCE(possibly_null_value[, possibly_null_value, ...]);

Swift

In Swift, the nil coalescing operator is ??. It is used to provide a default when unwrapping an optional type:

optionalValue ?? valueIfNil

For example, if one wishes to implement some Swift code to give a page a default title if none is present, one may use the following statement:

var suppliedTitle: String? = ...
var pageTitle: String = suppliedTitle ?? "Default Title"

instead of the more verbose

var pageTitle: String = (suppliedTitle != nil) ? suppliedTitle! : "Default Title";

Visual Basic.NET

In VB.NET the If[22] operator/keyword achieves this.

Dim pageTitle = If(suppliedTitle, "Default Title")

which is a more concise way of using its variation

Dim pageTitle = If(suppliedTitle <> Nothing, suppliedTitle, "Default Title")

See also

References

  1. BillWagner. "?? Operator (C# Reference)". msdn.microsoft.com.
  2. "perlop - perldoc.perl.org". perldoc.perl.org.
  3. "The Swift Programming Language (Swift 4): Basic Operators". developer.apple.com.
  4. "PHP: News Archive - 2015". php.net.
  5. "Bash man page".
  6. "Elvis operator". wikidocs.adobe.com.
  7. "[RAILO-2195] add support for the Elvis Operator - JBoss Issue Tracker". issues.jboss.org.
  8. cartermp. "Null Values (F#)". msdn.microsoft.com.
  9. cartermp. "Operator Overloading (F#)". msdn.microsoft.com.
  10. "Expressions". Apache FreeMarker Manual.
  11. "Hackage". Retrieved 10 July 2015.
  12. "Null safety". .
  13. "PHP: rfc:isset_ternary". Retrieved 16 December 2014.
  14. Kocak, Midori. "PHP RFC: Null Coalescing Assignment Operator". PHP.net. Retrieved 20 July 2017.
  15. "Is there a Python equivalent of the C sharp null-coalescing operator". stackoverflow.com.
  16. https://www.python.org/dev/peps/pep-0505/
  17. "Database SQL Language Reference". docs.oracle.com.
  18. "COALESCE (SQL Server Compact)". technet.microsoft.com.
  19. "PostgreSQL: Documentation: 9.1: Conditional Expressions". www.postgresql.org.
  20. "SQLite Query Language: Core Functions". www.sqlite.org.
  21. "MySQL :: MySQL 5.5 Reference Manual :: 12.3.2 Comparison Functions and Operators". dev.mysql.com.
  22. dotnet-bot. "If Operator (Visual Basic)". docs.microsoft.com.
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.