当我参与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 =>的“含义”。去”。我可以从WebSocket请求中推断出,我得到一个名为 out 的ActorRef,但我问是否有人可以让我看到这个语法和他们{{3}中找到的方法签名的匹配}。
我已经使用Akka + Scala开发了一个小应用程序,所以我知道一些scala的基本语法。
解决
见Angelo Genovese和bjfletcher的答案。
答案 0 :(得分:2)
request ⇒ out ⇒ MyWebSocketActor.props(out)
Is a function which takes a RequestHeader
and returns a function which takes an ActorRef
and returns a Props
in the API you linked this is represented as
f: (RequestHeader) ⇒ (ActorRef) ⇒ Props
it might be easier to visualize this way:
def first(request: RequestHeader) = {
def second (out: ActorRef) = {
MyWebSocketActor.props(out)
}
second _
}
答案 1 :(得分:2)
查看acceptWithActor
的定义:
def acceptWithActor(f: RequestHeader => HandlerProps)
你看到它接受一个函数参数,它接受一个RequestHeader
对象并产生一个HandlerProps
对象。
因此,您的目标是整合一个需要RequestHeader
的函数:
request => { ... produce HandlerProps here ... }
现在,你需要返回一个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 => ...
有时可以比没有更好地阅读。它们不是必需的,因为它们确实是由编译器推断的,编译器以与我上面解释的相同的方式查看所有这些内容。