💁‍♀️

Dartのcallとは?

2024/02/08に公開

💡Tips

https://dart.dev/language/callable-objects

Dart クラスのインスタンスを関数のように呼び出せるようにするには、call() メソッドを実装します。 call() メソッドを使用すると、それを定義する任意のクラスのインスタンスが関数をエミュレートできます。 このメソッドは、パラメーターや戻り値の型など、通常の関数と同じ機能をサポートします。 次の例では、WannabeFunction クラスは、3 つの文字列を受け取り、それらを連結し、それぞれをスペースで区切って感嘆符を追加する call() 関数を定義します。 「実行」をクリックしてコードを実行します。

公式のサンプル:

class WannabeFunction {
  String call(String a, String b, String c) => '$a $b $c!';
}

var wf = WannabeFunction();
var out = wf('Hi', 'there,', 'gang');

void main() => print(out);

🤔でもこれだけだとよくわからない?

Dartでは、callメソッドを使用して、nullableな関数オブジェクトを安全に呼び出すことができます。以下にその例を示します:

class NullableFunctionHolder {
  Function(int)? nullableFunction;

  void call(int n) {
    nullableFunction?.call(n);
  }
}

void main() {
  final holder = NullableFunctionHolder();

  holder.nullableFunction = (int n) {
    print('Called with $n');
  };

  // nullableFunctionがnullでない場合にのみ呼び出されます
  holder(10);
}

このコードでは、NullableFunctionHolderクラスにnullableな関数オブジェクトnullableFunctionを保持しています。callメソッドでは、nullableFunctionがnullでない場合にのみ、その関数を呼び出します。これにより、null参照エラーを防ぐことができます。

もし?がないとどうなるのか?

エラー出ましたね。初期値ないから当然か...
初期化を待ってあげるlateをつければ使うことはできる。

まとめ

Dartのcallについて解説してみました。普段使うことはないので、どこで使ってみたいですね。

参考になった記事
https://zenn.dev/chooyan/articles/d46a47c2709069

Discussion