2012-12-28 61 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

正如前面的答案所述,您只能爲函數字面量定義單個隱式參數,但有解決方法。

而不是多個隱含的參數,你可以寫函數文字爲多個參數列表每個參數與一個參數。然後可以將每個參數標記爲隱含的。重寫原片段:

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

您可以從authAction稱其爲f(request)(user)

implicit關鍵字重複是令人討厭的,但至少它工作。

6

從我能理解的語言規範中,從版本2.9.2開始,您只能爲匿名函數定義一個隱式參數。

E.g.

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

+1請參閱SLS 6.23 – paradigmatic

+0

任何人都知道爲什麼會出現這種情況?似乎有點任意。 – cdmckay

0

剛剛和你一樣,在Play中實現了一個authAction函數,很容易讓用戶通過。你可以像lambdas did it那樣做,用currying;我最終使我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

有沒有辦法來定義一個匿名函數多個隱式參數。

爲了詳細說明@ pagoda_5b答案,並@範式的評論中,Scala Language Specification第6.23定義,像這樣的匿名函數:

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

正如你所看到的,你可以定義的參數一個列表單隱式參數。

如果您需要隱含多個參數,則需要對它們進行咖喱。

相關問題