尝试修复客户端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))
如何正确构建匹配以便它接收类型?
答案 0 :(得分:3)
让我们稍微分解一下:
case Some(List(Some(msgType:String), Some(channel:String), Some(data:String))) =>
List(Some(msgType:String), Some(channel:String), Some(data:String)).foreach {
因此,此时,您必须提供从Option[String]
到某事的功能。这是至关重要的一点:您需要将函数作为参数传递给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
,channel
和data
进行迭代,它将完全相同,因此,调用传递的函数三次。)< / p>
case "message" | "pmessage" =>
fn(M(channel, data))
现在我们到了问题的关键点。 fn(M(channel,data))
是将传递给foreach
的函数,因此fn
的返回类型必须为String => ???
。由于您未提供有关fn
或M
的任何信息,因此我们无法评估可能存在的问题。
但是,也许你不打算让fn
返回一个函数,并且在foreach
上搞砸了。再一次,你没有解释你想要完成什么,所以我无法解释如何实现它。
case x => throw new RuntimeException("unhandled message: " + x)
}
}
答案 1 :(得分:0)
我愿意:
myList match {
case Some(xs @ List(Some(msgType:String), Some(channel:String), Some(data:String))) =>
xs.foreach {...}
case _ => {...}
}
我希望它有所帮助,即使一种更清洁的方式肯定存在。