Dartのカスケード記法(..)はRubyでいうtap

時々見かけるDartの謎な記法、カスケード記法。
どういうものかというと、..shuffle()みたいに、.をふたつ重ねる記法です。

  void main(){
    var hoge = [1,2,3];
    print((hoge..shuffle()).toString());
  }

Rubyを始めたばかりの頃も思ったのですが、こういうのって読み方がわからなくて調べるのに苦労しますよね…。カスケード記法というそうです。

cascadeとは 小滝、階段状に連続する滝、滝状に垂れたレース(など)、(菊などの)懸崖(けんがい)作り、縦つなぎ - Weblio辞書

つなぐ、という意味っぽい。
メソッドチェーン的なものかな?と思いましたが、なんかちょっと違う。
例にあげたshuffleの定義を覗いてみます。

void shuffle([Random random]);

shufflevoidで、呼び出し元のオブジェクト(レシーバ)を破壊的に変更して、戻り値は返しません。
なので、カスケード記法を使わないとこうなります。

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を使う必要は本来ないです

Dartを書いていて、Rubyでいうとtapかあ、と嬉しくなったお話でした☺️