警告 - 这是一个处理Codility BinaryGap任务的代码 - 只是为了警告,因为这可能会破坏某人的某些东西。
我有一段代码,比如
@tailrec
def count2(max:Int, count:Int, d:Seq[Char]):Int = d match {
case '1' :: s => count2(Math.max(max, count), 0, s)
case '0' :: s => count2(max, count+1, s);
case Nil => max
}
我称之为
println(Solution.count2(0, 0, Seq('1', '0')))
println(Solution.count2(0, 0, "10"))
它编译,但是第二个调用不起作用 - 抛出"匹配未找到10"我无法理解为什么。有similar question around that topic表示需要进行显式转换。但是,我觉得我确实有一个方法参数类型的形式。 调试器清楚地声明d变量是WrappedString类型 - 它应该完成这项工作。但显然,它没有。
这里发生了什么?
答案 0 :(得分:2)
当您传递List[Char]
类型的对象时,您的模式匹配仅适用于Seq[Char]
类型。因此,在第一次通话时,您永远不会真正匹配。它编译的原因是Seq
的匹配并非详尽无遗。但是,对于List
来说,这是详尽无遗的。
<强>更新强>:
让我指出两件事:
Seq
的默认构造函数生成List
。所以第一个例子&#34;起作用。&#34; String
可隐式转换为Seq[Char]
,但不是List
!因此,它会给你你的匹配错误。