>警告 - 这是一个处理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"我不明白为什么。围绕该主题有一个类似的问题,指出需要显式转换。但是,我觉得我确实有一个方法参数类型形式的方法参数类型。调试器明确指出 d 变量的类型是 WrappedString - 它应该完成这项工作。但显然,事实并非如此。
这是怎么回事?
当您传递类型为 Seq[Char]
的对象时,您的模式匹配仅在类型List[Char]
上工作。因此,您永远不会在第一次通话时真正匹配。它编译的原因是匹配对于Seq
并不详尽。然而,对于List
来说,它是详尽无遗的。
更新:
让我指出两件事:
Seq
的默认构造函数生成一个List
。所以第一个例子"有效"。- 您给出的
String
可以隐式转换为Seq[Char]
但它不是List
!因此,它将为您提供匹配错误。