📱

Dartの Null-aware operatorsについてのまとめ

2021/09/20に公開

はじめに

Dart 2.12 で sound null safety と呼ばれるnull安全機構が導入されました。

Dart 2.12 では sound null safety 機能を有効にした場合、以下のようなコードを実行しようとするとエラーになります。

void main() {
  int a = null;
}
main.dart:2:11: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
  int a = null;
          ^

この機能により、開発者は定義した変数に意図せずnullが代入されることを防ぐことが出来ます。

入出力など、nullが代入される可能性がある変数には、以下のように型名の末尾に ? を追加することでnullが代入される可能性があることを明示することが出来ます。

int? a = null;

ちなみに、Dartでは初期化されていない全ての変数のデフォルト値はnullとして扱われるため、

int a;

はコンパイルエラーになり、

int? a;

ではaにnullが代入されます。

Null-aware operators

Dartにはnullに関する専用のオペレーターが何種類かあります。順に見ていきましょう。

??= 演算子

??= 演算子は左項がnullの場合にのみ左項に右項を代入します。

int? a; // = null
a ??= 3;
print(a); // <-- Prints 3.

a ??= 5;
print(a); // <-- Still prints 3.

??= 演算子を使わない場合、以下のコードで同等のことが表現できます。

int? a; // = null 
if (a == null) {
  a = 3;
}
print(a); // <-- Prints 3.
if (a == null) {
  a = 5;
}
print(a); // <-- Still prints 3.

?? 演算子

?? 演算子は左項がnullの場合に右項、左項がnullでない場合に左項の式を返します。

JavaScriptやTypeScriptの Nullish Coalescing と同じように使えるようです。(Dartにはundefinedが無いので、トランスパイラで何かしら不具合が出る可能性はあります)

参考文献

https://dart.dev/codelabs/dart-cheatsheet

Discussion