Play Framework 中的 'request => out => ' 是什么意思

What's the meaning of: 'request => out => ' in Play Framework

当我深入研究 Play Framework 2 参考文档时,我发现了有关 WebSockets 的语法:

def socket = WebSocket.acceptWithActor[String, String] { request => out =>
  MyWebSocketActor.props(out)
}

https://www.playframework.com/documentation/2.3.x/ScalaWebSockets

但我无法理解此语法 'request => out' 的 "meaning"。我可以从 WebSocket 请求中推断出,我得到一个名为 out 的 ActorRef,但我想问是否有人可以让我看到与此语法的匹配以及在他们的 API.

我用过 Akka+Scala 开发过一个小应用,所以我知道一些 scala 的基本语法。

已解决

同时查看 Angelo Genovese 和 bjfletcher 的回答。

request ⇒ out ⇒ MyWebSocketActor.props(out)

是一个接受 RequestHeader 和 returns 的函数 一个接受 ActorRef 和 returns 的函数 Props

在您链接的 API 中表示为

f: (RequestHeader) ⇒ (ActorRef) ⇒ Props

这样想象可能更容易:

def first(request: RequestHeader) = {
  def second (out: ActorRef) = {
    MyWebSocketActor.props(out)
  }
  second _
}

查看 acceptWithActor 的定义:

def acceptWithActor(f: RequestHeader => HandlerProps)

你看到它接受一个函数参数,它接受一个 RequestHeader 对象并产生一个 HandlerProps 对象。

因此,您的目标是组合一个采用 RequestHeader:

的函数
request => { ... produce HandlerProps here ... }

现在,你需要return一个HandlerProps对象,让我们看看这是什么:

type HandlerProps = ActorRef => Props

因此,您的下一个目标是接收一个 ActorRef 对象并生成一个 Props:

request => {
    actorRef => {
        ... produce Props here ...
    }
}

现在,您需要生成一个 Props 对象:

MyWebSocketActor.props(out)

把它们放在一起,你就有了你的代码。 Play 使用惯例将 actor 引用命名为 out 而不是 actorRef.

希望对您有所帮助。

更新(见评论)

确实可以指定类型:

....acceptWithActor[String, String] { request: RequestHeader => out: ActorRef => ...

有时候读起来比没有读起来更好。它们不是必需的,因为它们确实是由编译器推断出来的,编译器以我上面解释的相同方式查看所有这些。