如何在Scala中定義具有多個隱式參數的函數文字?我試過這種方式:具有多個隱式參數的函數文字
def create = authAction { (implicit request, user) ⇒ // Syntax error
Ok(html.user.create(registrationForm))
}
但它會引發編譯錯誤。
如何在Scala中定義具有多個隱式參數的函數文字?我試過這種方式:具有多個隱式參數的函數文字
def create = authAction { (implicit request, user) ⇒ // Syntax error
Ok(html.user.create(registrationForm))
}
但它會引發編譯錯誤。
正如前面的答案所述,您只能爲函數字面量定義單個隱式參數,但有解決方法。
而不是多個隱含的參數,你可以寫函數文字爲多個參數列表每個參數與一個參數。然後可以將每個參數標記爲隱含的。重寫原片段:
def create = authAction { implicit request ⇒ implicit user ⇒
Ok(html.user.create(registrationForm))
}
您可以從authAction
稱其爲f(request)(user)
。
implicit
關鍵字重複是令人討厭的,但至少它工作。
從我能理解的語言規範中,從版本2.9.2開始,您只能爲匿名函數定義一個隱式參數。
E.g.
val autoappend = {implicit text:String => text ++ text}
+1請參閱SLS 6.23 – paradigmatic
任何人都知道爲什麼會出現這種情況?似乎有點任意。 – cdmckay
剛剛和你一樣,在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))
}
有沒有辦法來定義一個匿名函數多個隱式參數。
爲了詳細說明@ pagoda_5b答案,並@範式的評論中,Scala Language Specification第6.23定義,像這樣的匿名函數:
Expr ::= (Bindings | [‘implicit’] id | ‘_’) ‘=>’ Expr
ResultExpr ::= (Bindings | ([‘implicit’] id | ‘_’) ‘:’ CompoundType) ‘=>’ Block
Bindings ::= ‘(’ Binding {‘,’ Binding} ‘)’
Binding ::= (id | ‘_’) [‘:’ Type]
正如你所看到的,你可以定義的參數或一個列表單隱式參數。
如果您需要隱含多個參數,則需要對它們進行咖喱。
請您詳細說明您的代碼的上下文,或者給出一個更獨立的例子嗎?這樣可以更輕鬆地檢查哪些內容不適用於您的案例。我不知道'authAction','Ok','html'現在定義在哪裏。您是否在使用* Play!*或* Lift *或其他東西?謝謝 –
是的,我的Play應用程序片段,它工作正常,但兩個參數隱含的代碼將更乾淨。 – lambdas