JavaScriptを有効にしてください

Dartのカスケード記法(../?..)

 ·  ☕ 2 分で読めます

Dartの..?..って何?ってよく聞かれるので。

【公式】Cascade notation(カスケード記法)って呼ばれるもの。

カスケード記法

機械翻訳すると、Dartのカスケード記法は以下のように説明されている。

同じオブジェクトに対して一連の操作を行うことができます。関数呼び出しに加えて、同じオブジェクトのフィールドにアクセスすることもできます。これにより、一時変数を作成する手間が省け、より流動的なコードを記述できるようになります。

例えば、

1
2
3
4
var paint = Paint();
paint.color = Colors.black;
paint.strokeCap = StrokeCap.round;
paint.strokeWidth = 5.0;

をカスケードで書き直すと、

1
2
3
4
var paint = Paint()
  ..color = Colors.black
  ..strokeCap = StrokeCap.round
  ..strokeWidth = 5.0;

とかける。
直前に作ったpaintオブジェクトに対する関数呼び出しや、フィールドへのアクセスを短く記述できる。
カスケード記法に続くコードは、返されるかもしれない値を無視して、このオブジェクトを操作する。

null-shortingカスケード

カスケードが動作するオブジェクトがnullになる可能性がある場合は、?..で記述できる。

2.12以降
1
2
3
4
var button = querySelector('#confirm');
button?.text = 'Confirm';
button?.classes.add('important');
button?.onClick.listen((e) => window.alert('Confirmed!'));

は、

1
2
3
4
querySelector('#confirm') // Get an object.
  ?..text = 'Confirm' // Use its members.
  ..classes.add('important')
  ..onClick.listen((e) => window.alert('Confirmed!'))

と書ける。

注意

戻り値voidの関数にカスケードするとエラーになる。

1
2
3
var sb = StringBuffer();
sb.write('foo')
  ..write('bar'); // Error: method 'write' isn't defined for 'void'.

この場合、sb.writeの戻り値がvoidなのでカスケードできない。理屈が分かればなんのこっちゃない。

共有

tommy
著者
tommy
Software engineer⭐LPIC-3(304)⭐