後置記法

Scalaでは,arity-0のメソッドは後置記法で呼び出す事が可能です。

names.toList

// は次と同様

names toList

この記法の使用には十分注意が必要です。構文解析の曖昧さを回避するため,後置記法で呼び出されるメソッドは,必ず行の最後に位置しなければなりません。また,後続の行は空行でなくてはならず,さもなければScalaのパーサはそのメソッドを(誤って)中値記法とみなし,後続の行をまとめて解析しようとします。

names toList
val answer = 42        // コンパイルできない!

メソッドの後置記法は,副作用の無い,なるべくなら(上述の)括弧なしで宣言されたメソッドに対して使用するべきです。この記法の最もよく見られるケースは,中値記法のメソッドチェインの最後の操作としての用法です。

// 慣用的かつ許容し得る用法
names map { _.toUpperCase } filter { _.length > 5 } toStream

この場合,toStream関数は後置記法で呼び出される必要があり,そうでなければ,分離した値の代入が必要になります。しかし,より一般的に言えば,後置記法は避けるべき場合の方が多いでしょう。

// 誤り!
val ls = names toList

// 正しい!
val ls = names.toList

このルールに対する最も主要な例外が,ドメイン特化言語です。上記のルールに反する,多々見受けられる用法の1つがString値のRegexpへの変換です。

// 許容し得る用法
val reg = """\d+(\.\d+)?"""r

この例で,rは暗黙の変換を通じてString型で利用可能なメソッドであり,簡潔さのために後置記法で呼び出されています。しかし,次の例の方がより好ましいでしょう。

// より安全な呼び出し方
val reg = """\d+(\.\d+)?""".r

前のトピックへ

引数のないメソッド

次のトピックへ

1引数のメソッド

このページ

別のフォーマット

貢献