具有多个隐式参数的函数文字

时间:2012-12-28 15:49:17

标签: function scala syntax arguments syntax-error

如何在Scala中使用多个隐式参数定义函数文字?我试过这种方式:

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

但它会引发编译错误。

4 个答案:

答案 0 :(得分:17)

如前面的答案中所述,您只能为函数文字定义单个隐式参数,但有解决方法。

您可以将函数文字编写为多个参数列表,而不是多个隐式参数,每个参数列表都包含一个参数。然后可以将每个参数标记为隐式。重写原始片段:

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

您可以将authAction称为f(request)(user)

implicit关键字重复很烦人,但至少它有效。

答案 1 :(得分:6)

从我对语言规范的理解,从版本2.9.2开始,您只能为匿名函数定义一个隐式参数。

E.g。

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

答案 2 :(得分:0)

只是遇到了类似的情况,在Play中实现了一个可以轻松传递用户的authAction功能。你可以像lambdas did it那样做,并且可以使用curry;我最终让我的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))
}

答案 3 :(得分: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]

如您所见,您可以定义参数列表一个隐式参数。

如果您需要隐含多个参数,则需要对它们进行咖喱。