Mik*_*378 4 scala implicit playframework-2.0
在阅读Play时!框架文档,我遇到了这个片段:
def index = Action { implicit request =>
session.get("connected").map { user =>
Ok("Hello " + user)
}.getOrElse {
Unauthorized("Oops, you are not connected")
}
}
Run Code Online (Sandbox Code Playgroud)
文档说明implicit:
或者,您可以从请求中隐式检索会话
此外,我读了这篇文章:Literal with Implicit,从逻辑上看,函数不能有隐含参数.
如果我很清楚,这是因为一个函数,与方法相反总是一个契约(接口).
实际上,例如,Function1[Int, Function1[Int, Int]]具有返回类型的第一个参数a Int,因此阻止我们将此注释为implicit.这会导致对其高级返回类型的混淆:() => Int或Int => Int ......
因此,前面的代码片段代码的行为是隐含的,因为第一个Action必需参数是一个文字函数.
我想允许编译器接受此代码的原因是Action.apply()方法的多个签名:
def apply(block: Request[AnyContent] => Result): Action[AnyContent]def apply(block: => Result): Action[AnyContent] (重定向到第一个)由于第二个不需要一些参数,是否在存在文字函数的隐式参数时选择了这个参数?
请考虑以下代码:
class MyImplicitClass(val session: Int)
object Tester {
def apply(fun: MyImplicitClass => Int): Int = ???
def apply(fun: => Int): Int = ???
}
Tester { implicit myImplicitClass => session * 20}
Run Code Online (Sandbox Code Playgroud)
如果这个功能:
def session(implicit myImplicitClass: MyImplicitClass): Int = myImplicitClass.session
Run Code Online (Sandbox Code Playgroud)
在范围内,然后第一个代码片段将编译,因为显然隐式参数myImplicitClass将被传递给函数 session以访问该字段 myImplicitClass.session,允许您省略字段访问.这正是Play的伎俩!框架正在使用,检查Controller查找session功能.
作为旁注,上面的闭包并没有声明它需要一个隐式参数,它是一种语言功能,以避免必须执行以下操作:
Tester { myImplicitClass =>
implicit val x = myImplicitClass
session * 20
}
Run Code Online (Sandbox Code Playgroud)
当一个人想要使用一个闭包参数作为闭包体内的隐含值.另请注意,从Scala 2.9开始,您只能使用具有1个参数的闭包.