2016-12-12 3 views
4

O私はgithubの上thisコードで奇妙なタイプを発見:目的(=> A)=>

final class StaticRouteB[Page, O](private val f: (=> Action[Page]) => O) extends AnyVal { 
    def ~>(a: => Action[Page]): O = f(a) 
    } 
  1. fのタイプ。どういう意味ですか ?私の推測では、それは名前引数による呼び出しを持つ関数であるということです。以前は見たことがないので、それが何であるか、あるいはこのことがどのように機能するかはわかりません。

  2. このタイプをさらに「標準」に変換する方法はありますか? (それは(=> Action[Page]) => O)タイプを使用しないように、私は、意味上のコードは?このタイプはいくつかの構文糖ですか?)

  3. 私はStaticRouteBを作成するときに、私はfとしてAction[Page] => Oを渡すとどうなるか、特にだろうか?コンパイルエラーが発生しますか?ランタイムエラー ?どうして ?つまり、(=> ...)の目的は何ですか?正しい種類の関数が渡されない場合や、fのパラメータの評価方針を変更する場合は、コンパイルエラーを出すのですか?なぜ誰かがこのようなタイプをしたいのですか?どのような目的のために?

答えて

7

(=> Action[Page]) "コール名によって" パラメータです。

のでf: (=> Action[Page]) => Oはタイプアクションのnameパラメータで呼び出し[ページ]との関数であり、この関数はタイプO.

の結果を返しますあなたは方法~>定義でその使用状況を見ることができます。

+0

ありがとう、このタイプをもっと「標準的な」ものに変換する方法はありますか? – jhegedus

+0

また、 'StaticRouteB'を作成するときに' Action [Page] => O'を 'f'として渡すとどうなりますか?コンパイルエラーが発生しますか?ランタイムエラー ? – jhegedus

+1

これは、このタイプを書くための標準的でシンプルな方法です。必要に応じて、タイプエイリアスを使用できます。しかし、それは "フードの下に"何かを単純化しません。 – Tyth

関連する問題