1

尝试修复客户端 API 但在此处遇到问题:

case Some(List(Some(msgType:String), Some(channel:String), Some(data:String))) =>
        List(Some(msgType:String), Some(channel:String), Some(data:String)).foreach {
            msgType match {
              case "message" | "pmessage" => 
                fn(M(channel, data))
              case x => throw new RuntimeException("unhandled message: " + x)
            }
        }

当我去编译代码时,我得到了type mismatch; found : Any required: Some[String] => ?错误fn(M(channel, data))

如何正确构建匹配以使其接收类型?

4

2 回答 2

3

让我们分解一下:

case Some(List(Some(msgType:String), Some(channel:String), Some(data:String))) =>
    List(Some(msgType:String), Some(channel:String), Some(data:String)).foreach {

所以,在这一点上,你必须提供一个函数 from Option[String]to something。这是关键点:您需要将函数作为参数传递给foreach. 让我们继续:

        msgType match {

您可能会认为这是一个函数——它不是。也许你明白这一点,但是,以防万一,让我解释一下这一点。函数接受一个参数并返回其他内容:它可以通过多种方式声明:

x => f(x) // anonymous function
{ case x => f(x) } // pattern-matching anonymous function
f _ // eta expansion of method f
f(_) // partial function application
_ + 1 // anonymous function with placeholder syntax

请注意,msgType match {以上都不是。

现在,msgType这里指的是在第一种情况下匹配的内容。每次调用都将完全相同foreach(它将遍历msgType,channeldata,因此,调用传递的函数三次)。

          case "message" | "pmessage" => 
            fn(M(channel, data))

现在我们到达了问题的关键点。fn(M(channel,data))是将要传递给 的函数foreach,因此 的返回类型fn必须是String => ???。由于您没有提供有关fnor的任何信息M,因此我们无法评估可能出现的问题。

但是,也许你不打算fn返回一个函数,并且搞砸了foreach. 同样,你没有解释你想要完成什么,所以我无法解释如何完成它。

          case x => throw new RuntimeException("unhandled message: " + x)
        }
    }
于 2012-05-28T21:31:39.883 回答
0

我会做:

myList match {
  case Some(xs @ List(Some(msgType:String), Some(channel:String), Some(data:String))) =>
    xs.foreach {...}
  case _ => {...}
}

我希望它有所帮助,即使肯定存在更清洁的方式。

于 2012-05-28T20:02:44.230 回答