从http://backchatio.github.io/hookup/scaladoc/io/backchat/hookup/DefaultHookupClient.html获得此代码:
new DefaultHookupClient(HookupClientConfig(new URI("ws://localhost:8080/thesocket"))) {
def receive = {
case Disconnected(_) ⇒ println("The websocket to " + uri.toASCIIString + " disconnected.")
case TextMessage(message) ⇒ {
println("RECV: " + message)
send("ECHO: " + message)
}
}
connect() onSuccess {
case Success ⇒
println("The websocket is connected.")
case _ ⇒
}
}
receive
是一个回调函数,在收到连接更新时触发但是每个case语句类型如何确定为没有匹配语句,哪些case语句匹配?
答案 0 :(得分:4)
这是Scala用于定义部分函数的语法糖,并不是match
(这是它自己的语言结构而不是正式的方法)所特有的。这就是您可以编写以下内容的原因,例如:
scala> Option(1).map { case x if x == 1 => "foo"; case _ => "bar" }
res0: Option[String] = Some(foo)
map
预计某些Function[Int, B]
为B
,PartialFunction[Int, String]
为Function[Int, String]
的子类型,因此我们可以使用部分函数语法糖来提供论据。
请注意,必须知道部分函数的输入和输出类型 - 即。它们不能被推断(对Scala的普通匿名函数语法有类似的限制):
scala> val f = { case x if x == 1 => "foo"; case _ => "bar" }
<console>:11: error: missing parameter type for expanded function
The argument types of an anonymous function must be fully known. (SLS 8.5)
Expected type was: ?
val f = { case x if x == 1 => "foo"; case _ => "bar" }
^
如果您正在查看,DefaultHookupClient
会继承receive
方法,其返回类型为Receive
,这是PartialFunction[InboundMessage, Unit]
的类型别名,所以你不会遇到这种限制因为这种类型已经知道了。
答案 1 :(得分:1)
它们与函数参数匹配。这是一个可以与匿名函数一起使用的快捷方式:
{
case foo => bar
case bat => baz
}
与
相同{ x => x match {
case foo => bar
case bat => baz
}}