【发布时间】:2015-07-29 06:44:52
【问题描述】:
我对列表前缀(即列表的前几个元素)的模式匹配有疑问。
这可以编译,但没有按预期工作:
val l = List(1,2,3)
val test = { m: List[Int] =>
m match {
case l :: tail => println("tail: "+tail.mkString(","))
case _ => println("no match")
}
}
test(List(1,2,3,4,5))
输出为tail: 2,3,4,5。我希望它会说tail: 4,5,或者不匹配,或者在编译时失败。是什么让它如此运作?
我的第二个问题是:如何使用列表匹配列表前缀?我知道这可以按我的预期工作:
case 1 :: 2 :: 3 :: tail => println("tail: "+tail.mkString(","))
但是,我的前缀是列表,不能硬编码。模式匹配在这里是否正确?
我知道我可以做类似的事情
if (m startsWith l) {
val tail = m drop l.size
}
但一长串这些似乎相当不雅,尤其是在 Scala 中。
【问题讨论】:
-
如果前缀
List(1,2,6)与List(1,2,3,4,5)匹配,您的预期结果是什么?是List(3,4,5)还是不匹配? -
好点。我希望没有匹配。
-
两个评价最高的答案都很棒 - StackOverflow 需要共同接受!
标签: list scala pattern-matching