如何评估这些案例陈述类型?

时间:2016-05-21 20:38:45

标签: scala

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语句匹配?

2 个答案:

答案 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]BPartialFunction[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
}}