ダブルドットで書いてあるコード
Dart特有の記法である..と言う記法。最初はなんて言う名前の書き方なのかさっぱり分からんで、こいつは一体何をしているのか分からなかったですが、カスケード記法と言うらしい。
使われ方
同一オブジェクトに対して、複数の操作をする際に使う記法だそうです。
ユースケース1
/*このように変数listに対して様々な処理を入れているコードは・・・*/
var list = new List();
list.add(1);
print(list);
list.add(2);
list.addAll([3,4,5,6,7,8,9,10]);
list.fillRange(0, 3, 99);
list[3] = 0;
list.removeLast();
print(list);
/*カスケードで書き直すと、下記のようになる*/
var list2 = new List()
..add(1)
..add(2)
..addAll([3,4,5,6,7,8,9,10])
..fillRange(0, 3, 99)
..[3] = 0
..removeLast();
print(list2);
}
すっきりしたコードになっていますね。
こちらの記事から例としてのコードは拝借しました。個人的に1番理解しやすい例だったので。
プログラミング言語Dart基礎
注意点(但し、推測による考察)
じゃ、何でもかんでもカスケード記法を使って書けるかと言うと、実はそうではないです。
void main() {
var a = "kujou joutarou";
var b = a.substring(2,8);
var c = b.replaceFirst('u','');
print(a); /*出力結果=> "jo jo"*/
これをカスケード記法にしてやろうとすると、
void main() {
var a = "kujou joutarou"
..substring(2,8)
..replaceFirst('u','');
print(a); /*出力結果=> "kujou joutarou"*/
}
なんの処理もされていません。どうしてカスケードが効かないのかと言うと、それは扱う変数の
型にあると思って下記を書きましたが、どうもこの考察は間違っていました。
型にはミュータブルとイミュータブルの2種類が存在します。
文字列などの型は、操作すると、それは操作されたオブジェクトとして別の変数名で再定義しないと処理内容が保存されないイミュータブルなものであり、配列といったものは一旦操作すれば、別名でわざわざ再定義する必要なく、同一の変数名を使い回すことができます。
カスケード記法は**同一オブジェクトに対して、複数の操作をする際に使う記法**なので、同一オブジェクトに複数処理をかけることができないイミュータブルな型には使うことができないと言うことになると思います。
下記の記事がミュータブルとイミュータブルについてすごい分かりやすいです。
ミュータブルな型とイミュータブルな型の相違を知ろう
正しくは、使用するメソッドの違いがあります。重要なのは、インスタンスの内部状態が変化するかどうかです。
言い換えると、『例で書いてるコードに使われたメソッドは加工された値返すだけで、その変数に代入されている値は変化しないでしょ?』と言うことで、もっと言うと、『非破壊的なメソッドだから変数にはなんも影響ないやろ?』ってことですね。
ユースケース2
使用するメソッドがshuffleのように戻り値がなく、voidを返してしまう性質のメソッドだった場合、それでも操作結果を返して欲しいと思う時にも使えます。shuffleもレシーバにあたるインスタンスの値そのものを変更してしまう破壊的なメソッドであると言うことですね。
class _MyHomePageState extends State<MyHomePage> {
static final _data = [
Data('Apple',200),
Data('Orange',150),
Data('Peach',300)
];
Data _item;
@override
void initState(){
super.initState();
_item = _data[0];
}
void _setData(){
setState(() {
_item = (_data..shuffle()).first;
});
}
まとめ
と言うわけで、カスケード記法に関する使い方と気になったところのまとめでした。間違ってたらコメントください。お願いします。