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 => ...
有时候读起来比没有读起来更好。它们不是必需的,因为它们确实是由编译器推断出来的,编译器以我上面解释的相同方式查看所有这些。
当我深入研究 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 => ...
有时候读起来比没有读起来更好。它们不是必需的,因为它们确实是由编译器推断出来的,编译器以我上面解释的相同方式查看所有这些。