Dartのカスケード記法(..)はRubyでいうtap
時々見かけるDartの謎な記法、カスケード記法。
どういうものかというと、..shuffle()
みたいに、.
をふたつ重ねる記法です。
void main(){ var hoge = [1,2,3]; print((hoge..shuffle()).toString()); }
Rubyを始めたばかりの頃も思ったのですが、こういうのって読み方がわからなくて調べるのに苦労しますよね…。カスケード記法というそうです。
cascadeとは 小滝、階段状に連続する滝、滝状に垂れたレース(など)、(菊などの)懸崖(けんがい)作り、縦つなぎ - Weblio辞書
つなぐ、という意味っぽい。
メソッドチェーン的なものかな?と思いましたが、なんかちょっと違う。
例にあげたshuffleの定義を覗いてみます。
void shuffle([Random random]);
shuffle
はvoid
で、呼び出し元のオブジェクト(レシーバ)を破壊的に変更して、戻り値は返しません。
なので、カスケード記法を使わないとこうなります。
void main(){ var hoge = [1,2,3]; // print(void)はできないのでコンパイルエラー // print(hoge.shuffle()); // hoge自体を破壊的に変更してからprintすると期待通りの挙動になる hoge.shuffle(); print(hoge); }
ただ、何度も呼び出そうと思うと行数も増えてしまうので、できればメソッドチェーンの形で書きたい。
そんな時のカスケード記法。
void main(){ var hoge = [1,2,3]; print(hoge..shufle()); // 破壊的に変更した後のhogeを返してくれる }
Rubyでいうと、tapでしょうか。
hoge = [1,2,3] p hoge.tap{|item| item.shuffle!} # shuffle!はレシーバ自体を返すので、tapを使う必要は本来ないです