如何在Scala中解释=>的序列?

be_*_*_mi 4 scala playframework-2.0

我目前正在开始使用play框架,但我的Scala知识还不够.

据我所知=>表示IsAuthenticated有一些函数作为参数.我发现了f:=> String ...是一个没有输入值的函数.但是如何用3 =>来解释整行?更进一步说,第二行中究竟发生了什么=> f(用户)(请求)?用户和请求对象的目标函数是什么?

  def IsAuthenticated(f: => String => Request[AnyContent] => Result) = Security.Authenticated(username, onUnauthorized) { user =>
    Action(request => f(user)(request))
  }
Run Code Online (Sandbox Code Playgroud)

Chr*_*tin 5

=> String => Request[AnyContent] => Result
Run Code Online (Sandbox Code Playgroud)

添加了parens更容易阅读:

=> (String => (Request[AnyContent] => Result))
Run Code Online (Sandbox Code Playgroud)

你可以在REPL中试试这个.例如:

scala> def foo(f: => String => Int => Char): Char = f("abcdefgh")(4)
foo: (f: => String => (Int => Char))Char
Run Code Online (Sandbox Code Playgroud)

在这个例子中,f是一个nullary函数 call-by-name参数,它返回一个函数(让我们调用那个函数g).g是一个接受String参数并返回另一个函数(h)的函数.h是一个接受Int参数并返回Char的函数.

示例调用:

scala> foo { s: String => { i: Int => s.charAt(i) } }
res0: Char = e
Run Code Online (Sandbox Code Playgroud)

让我们在评估时遍历方法体中每个表达式的类型:

  • f
    • 类型: String => (Int => Char)
    • 值: { s: String => { i: Int => s.charAt(i) } }
  • f("abcdefgh")
    • 类型: Int => Char
    • 值: { i: Int => "abcdefgh".charAt(i) }
  • f("abcdefgh")(4)
    • 类型: Char
    • 值: 'e'

  • 它被称为`name by name`(`by name parameter`),而不是`nullary function`. (3认同)