そらえふのブリキ

Dart言語におけるNullable値の扱い方のTips

Dart言語におけるNullable値の扱い方のTips

プログラミングでは、しばしばnullが許容される変数を扱うことがあります。Dart言語においても、このnullableな値の扱いは重要なポイントです。今回は、int?のようなnullableな値をより便利に扱うためのTipsを紹介します。

Nullableな値を2倍にする関数の例

例えば、次のような整数値を2倍にする単純な関数があるとします。

int func(int value) => value * 2;

この関数をint?型の変数に適用したい場合、通常は次のように書く必要があります。

int? value = null;
if (value == null) {
  return null;
}
return func(value);

あるいはワンライナーで次のように書くこともできますが、これは少々冗長です。

func(value) != null ? func(value) : null;

letを使ったシンプルな書き方

しかし、letを使用することで、もっとシンプルに書くことができます。

value?.let((value) => func(value));

letは次のようなextensionとして定義されています。

extension UniversalExtension<T> on T? {
  T? let(T Function(T it) func) {
    if (this == null) return null;
    return func(this as T);
  }
}

letは関数を引数にとり、valuenullableでない場合にのみその関数を呼び出します。したがって、valuenullの場合はnullを返し、そうでない場合は指定した関数を適用した結果を返します。

このため、func(value) != null ? func(value) : null;という冗長な記述を、value?.let((value) => func(value));と書き換えることができるのです。さらに、funcの引数が一つだけの場合は、以下のようにさらに短く書くことができます。

value?.let(func);

alsoメソッドによるNullable値の処理

letメソッドのほかに、nullableな値に対して別のアプローチを提供するalsoメソッドもextender_dartライブラリに定義されています。このメソッドはletと似ていますが、値を返す代わりに指定された関数を実行してから元の値を返します。

alsoメソッドの定義

alsoメソッドは以下のように定義されています。

extension UniversalExtension<T> on T? {
  T? also(void Function(T it) func) {
    if (this == null) return null;
    func(this as T);
    return this;
  }
}

このメソッドは、nullableな値がnullでない場合にのみ、引数として与えられた関数を実行します。そして、元の値を変更せずにそのまま返します。

alsoメソッドの使用例

例えば、値をログに記録しながらその値を維持したい場合に役立ちます。

int? value = 10;
value?.also((v) => print('Value is $v')).let(func);

上記のコードでは、valuenullでなければ、まずその値をコンソールに出力し、次にletを使ってその値に対してfuncを適用します。このようにalsoを使用すると、副作用(この場合はログ出力)を発生させつつ、値を変更せずにそのまま次の処理に渡すことができます。

let, alsoメソッドを定義したextender_dartというライブラリを作成しました。

extender_dartライブラリは、nullableな値を扱う際に非常に有用です。ぜひ利用して、より効率的なコードを書いてみてください。

extender_dartパッケージ

そらえふ

ソフトウェアエンジニア。趣味は競馬、写真、ゲーム。

お問い合わせはXのDMでお願いします。