Null合体演算子null合体演算子(ヌルがったいえんざんし、null coalescing operator)はC#[1]やバージョン5.10以降のPerl[2]、Swift[3]など、いくつかのプログラミング言語に存在する、ある種の条件演算子で、PerlではDefined-or 演算子と呼ばれる。エルビス演算子も参照。C言語の3項演算子 例C#C#ではnull合体演算子は possiblyNullValue ?? valueIfNull
例えば、ページのタイトルが存在しない場合に既定値として"Default Title"を設定したい場合には、以下の文を用いることができる。 string pageTitle = suppliedTitle ?? "Default Title";
これは次のようなより冗長な表現の代わりとして用いることができる。 string pageTitle = (suppliedTitle == null) ? "Default Title" : suppliedTitle;
あるいは string pageTitle;
if (suppliedTitle == null)
pageTitle = "Default Title";
else
pageTitle = suppliedTitle;
これら3つの表現は等価である。 この演算子は同じ式の中で複数回用いることができる。 return some_Value ?? some_Value2 ?? some_Value3;
一度、非nullな値が設定されるか、最終値(nullであるかもしれないしnullでないかもしれない)にたどり着くと完了する。 CFMLColdFusion 11[4]もしくはRailo 4.1[5]ではCFMLはnull合体演算子を三項演算子 possiblyNullValue ?: valueIfNull
PerlPerl(5.10以降)においてnull合体演算子は $possibly_null_value // $value_if_null
possibly_null_valueはnullか非nullか(もしくは、Perlにおいては未定義か定義済みか)評価される。評価に基づき、possibly_null_valueがnullの場合にはvalue_if_nullが返され、そうでない場合はpossibly_null_valueが返される。三項演算子 ( defined($possibly_null_value) ? $possibly_null_value : $value_if_null
この演算子の最も一般的に利用法は単なるnullチェックのためのコードを最小限にするためである。 ある種の非nullの値(Perlの場合、0と空文字列)を偽として取り扱う他の言語と同様に、論理和演算子" DB<1> print 0 // 1 # null合体演算子
0
DB<2> print 0 || 1 # null合体演算子ではない
1
Perlはさらに a //= b
は a = a // b
とおおむね等価である。 SwiftSwiftではnil合体演算子は optionalValue ?? valueIfNil
例えば、ページのタイトルが存在しない場合にデフォルトとして"Default Title"を設定するSwiftのコードを実装したい場合には、以下の文を用いることができる。 var suppliedTitle: String? = ...
var pageTitle: String = suppliedTitle ?? "Default Title"
これは以下の冗長な文の代わりとなる。 var pageTitle: String = (suppliedTitle != nil) ? suppliedTitle! : "Default Title";
SQLOracleの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標準規格はOracle[6]、SQL Server[7]、PostgreSQL[8]、SQLite[9]、そしてMySQL[10]に実装されているCOALESCE関数を含む。COALESCE関数はnullでない最初の引数を返し、すべての引数がnullの場合はnullを返す。 COALESCE(possibly_null_value[, possibly_null_value, ...]);
PHPPHPではPHP 7以降でnull合体演算子 $var = $foo ?? $bar ?? $foobar;
// これは以下と等価である。
$var = (isset($foo) ? $foo : (isset($bar) ? $bar : $foobar));
PHP 7でnull合体演算子 $foo = $foo ? $foo : $bar;
$foo = $foo ?: $bar;
return $foo ?: $bar;
しかし、PHPの文法上の不幸なエラーにより[16]、三項の条件演算子はPHPにおいては期待される動作と違い左結合性であるため、 複数の条件演算子を組み合わせると極めて直感的でない結果となる[11]。エルビス演算子は(三項演算子の場合と同様に)チェーン表記した際にこの文法上の制約にさらされる。 // 以下は等価である。
$var = $foo ? $bar : $bar ?: $baz;
$var = ($foo ? $bar : $bar) ?: $baz;
$var = $bar ?: $baz;
// 期待される動作は括弧を用いることによって得られる。
$var = $foo ? $bar : ($bar ?: $baz);
一方、 これらの演算子は、PHPにおける三項演算子の(通常の)用法と同様に、結果を変数に代入する代わりにechoやreturnにも用いることができる。 echo $foo ?? $bar;
echo $foo ?: $bar;
return $foo ?? $bar;
return $foo ?: $bar;
JavaScriptECMAScript 2020でNull合体演算子がサポートされた[17]。 const a = b ?? 3;
他の演算子を使用しての再現条件演算子やOR演算子などを用いることでnull合体演算子と同様の働きを再現させることができる言語も多い。
PythonPythonの >>> 0 or 1
1
もしも SchemeSchemeでは"偽"と"null"は JavaScript(ECMAScript 2019以前)ECMAScript 2019以前では、null合体演算子の役割は論理 function setTitle(suppliedTitle) {
this.title = suppliedTitle || "Default title";
}
これはJavaScriptの真偽判定のコンセプト上の問題により、null合体の正しい例ではないことに注意が必要である。このため、JavaScriptが偽であると評価する値(例えば0や偽)も同様に文の評価において合体され、望ましくない結果をもたらす可能性がある。 Kotlinval title = suppliedTitle ?: "Default title"
GroovyGroovy[19]でもKotlinと同様にエルビス演算子を使用することができる。 エルビス演算子は本来はnullではなくfalseのチェックを行うものだが、これらの言語ではnullはfalseとみなされる。 Objective-CObjective-Cにおいてはnull合体演算子の役割は id valueOrNil = ...;
id nonNilValue = valueOrNil ?: @"Some Default Value";
注意:JavaScriptやPythonの場合と同様に、 F#nullはF#においては値や変数として通常用いられない[20]。しかしながら、例えばF#のコードがC#から呼ばれるような場合にnullが登場する。 F#は組み込みのnull合体演算子を持っていないが、必要に応じてカスタムの演算子として定義することができる[21]。 let (|?) lhs rhs = (if lhs = null then rhs else lhs)
このカスタムの演算子はC#の組み込みのnull合体演算子と同様に用いることができる。 let pageTitle = suppliedTitle |? "Default Title"
SmalltalkSmalltalkには演算子は存在せず専用の構文も存在しないが、関数呼び出しに相当するメッセージ式と無名関数に相当するブロックの組み合わせで同等の機能を実現している。 value := value ifNil: [ 0 ].
なお、逆の式も存在する。 value := value ifNotNil: [ 0 ].
ブロックと式の組み合わせであるため下記のように分離することもできる。 これは、ブロックを上位のメソッドから引数として受とる場合に役に立つ。 block := [ :argument | 1 + argument ].
value := value ifNotNil: block.
関連項目参考文献
|
Portal di Ensiklopedia Dunia