2012-12-28 18 views
7

Scalaで複数の暗黙の引数を使用して関数リテラルを定義する方法はありますか?私はこの方法を試しました:複数の暗黙的な引数を持つ関数リテラル

def create = authAction { (implicit request, user) ⇒ // Syntax error 
    Ok(html.user.create(registrationForm)) 
} 

しかし、それはコンパイルエラーをスローします。

+0

あなたのコードの文脈についてもっと詳しく教えてください。もっとスタンドアロンの例を挙げてください。これにより、あなたのケースでうまくいかないものを簡単に確認することができます。 'authAction'、' Ok'、 'html'が今どこに定義されているのかは分かりません。あなたは* Play!*や* Lift *などを使っていますか?ありがとう –

+0

はい、Playアプリケーションのスニペットはうまくいきますが、両方の引数を使用すると、暗黙のコードがきれいになります。 – lambdas

答えて

16

前述のように、関数リテラルに対して1つの暗黙のパラメータしか定義できませんが、回避策があります。

複数の暗黙的な引数の代わりに、1つの引数を持つ複数の引数リストを取る関数literalを書くことができます。次に、各引数を暗黙的にマークすることができます。オリジナルのスニペットを書き換え:

def create = authAction { implicit request ⇒ implicit user ⇒ 
    Ok(html.user.create(registrationForm)) 
} 

あなたはf(request)(user)としてauthActionからそれを呼び出すことができます。

implicitキーワードの重複は厄介ですが、少なくとも動作します。

6

バージョン2.9.2では、言語仕様の理解から、匿名関数に対して暗黙のパラメータを1つだけ定義できます。

など。

val autoappend = {implicit text:String => text ++ text} 
+4

+1 SLSを参照してください。6.23 – paradigmatic

+0

これがなぜこのようになるのでしょうか?恣意的なようだ。 – cdmckay

0

PlayでauthAction機能を実装して、簡単にユーザーを通過させるような状況になっています。lambdas did itのようにすることができます。私は私のauthAction関数が暗黙のうちにRequestHeaderを受け取る作ることになったが、明示的に要求し、ユーザの両方に合格:

def authAction(f: (RequestHeader, User) => Result)(implicit request: RequestHeader) = { 
    ... 
    val authUser = loadUser(...) 
    f(request, authUser) 
} 

をし、それを使用する:

def create = authAction { (request, user) => 
    Ok(html.user.create(registrationForm)) 
} 
0

と匿名関数を定義する方法はありません複数の暗黙のパラメータあなたが見ることができるように

Expr ::= (Bindings | [‘implicit’] id | ‘_’) ‘=>’ Expr 
ResultExpr ::= (Bindings | ([‘implicit’] id | ‘_’) ‘:’ CompoundType) ‘=>’ Block 
Bindings ::= ‘(’ Binding {‘,’ Binding} ‘)’ 
Binding ::= (id | ‘_’) [‘:’ Type] 

、あなたはパラメータまたは Aのリストを定義することができ、次のいずれかScala Language Specificationのセクション6.23がそうのような無名関数を定義して、pagoda_5bの答え@とのパラダイムコメント@については詳しく説明し

単一暗黙のパラメータ。

複数のパラメータが暗黙的に必要な場合は、それらをカレーする必要があります。

関連する問題