【发布时间】:2011-10-12 01:27:42
【问题描述】:
我有以下代码递归地对列表中的每个元素进行操作
def doMatch(list: List[Int]): Unit = list match {
case last :: Nil => println("Final element.")
case head :: tail => println("Recursing..."); doMatch(tail)
}
现在,忽略此功能可通过 filter() 和 foreach() 获得,它工作得很好。但是,如果我尝试将其更改为接受任何 Seq[Int],则会遇到问题:
- Seq 没有 ::,但它确实有 +:,据我了解,这基本上是一回事。但是,如果我尝试在 head +: tail 上进行匹配,编译器会抱怨“错误:未找到:值 +:”
- Nil 是 List 特有的,我不确定用什么替换它。如果我能解决上一个问题,我会尝试 Seq()
我认为代码应该是这样的,但它不起作用:
def doMatch(seq: Seq[Int]): Unit = seq match {
case last +: Seq() => println("Final element.")
case head +: tail => println("Recursing..."); doMatch(tail)
}
编辑:这么多好的答案!我接受了敏捷钢的回答,因为他是第一个指出 :: 在我的示例中不是运算符,而是一个案例类,因此是不同的。
【问题讨论】:
-
两个旁注:
final不允许作为标识符,编译器抱怨说,这些案例并不详尽。您可以改用:def doMatch (list: List[Int]): Unit = list match { | case last :: Nil => println ("Final element.") case head :: tail => println ("Recursing..."); doMatch (tail) case Nil => println ("only seen for empty lists") }。 -
是的,final 是一个“简化场景”的错误。我将其更改为 last 以便它可以编译,但我省略了您的 case Nil 以便评论对问题有意义。谢谢。
-
我可以删除评论 - 没问题。这将节省新读者一些时间,找到一个更正确的问题,而不是评论,而不是他们喜欢纠正的东西,直到他们找到评论和评论的答案...... SE应该像一个维基,人们为解决方案做出贡献 - 生产文档并不那么重要,以及谁编写了什么。
-
为什么不在this SO question 中使用类似于
trycatch的方法?本质上,使用Seq的大小并使用head和tail来访问所需的元素。
标签: scala collections pattern-matching