意思是:'request => out => '在Play框架中

时间:2015-06-26 16:03:19

标签: scala syntax playframework

当我参与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的答案。

2 个答案:

答案 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 => ...

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