プログラミングでは、しばしばnull
が許容される変数を扱うことがあります。Dart言語においても、このnullable
な値の扱いは重要なポイントです。今回は、int?
のようなnullable
な値をより便利に扱うためのTipsを紹介します。
例えば、次のような整数値を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
は関数を引数にとり、value
がnullable
でない場合にのみその関数を呼び出します。したがって、value
がnull
の場合は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);
上記のコードでは、value
がnull
でなければ、まずその値をコンソールに出力し、次にlet
を使ってその値に対してfunc
を適用します。このようにalso
を使用すると、副作用(この場合はログ出力)を発生させつつ、値を変更せずにそのまま次の処理に渡すことができます。
let
, also
メソッドを定義したextender_dart
というライブラリを作成しました。
extender_dart
ライブラリは、nullable
な値を扱う際に非常に有用です。ぜひ利用して、より効率的なコードを書いてみてください。
ソフトウェアエンジニア。趣味は競馬、写真、ゲーム。
お問い合わせはTwitterのDMでお願いします。