【发布时间】:2018-11-09 14:52:23
【问题描述】:
对于以下条件 - 已为 Tuple2(BigDecimal,BigDecimal) 定义了模式匹配
(r.get(0), r.get(1)) match {
case (r0: BigDecimal, r1: BigDecimal) => (bigDecimalNullToZero(r0), bigDecimalNullToZero(r1))
case (r0,r1) => {
error(s"Unable to compare [$r0] and [$r1]"); (0L,0L)
}
}
为什么无法识别匹配项?
【问题讨论】:
-
@TzachZohar r0 和 r1 的类型在第二张截图中显示为
BigDecimal -
我可以看到,我在问
r的类型——或者更准确地说,r.get的签名 -
@DanW 不知道为什么会有用:在那个时刻,预期的(/正确的?)第一个匹配已经被绕过
-
@TzachZohar 哦,我明白你的意思了。是的,类型是
Any。那么compile时间类型不是runtime类型.. 我想这是有道理的.. 没有等待不.. 运行时类型检查实际上是模式匹配的关键部分:那么为什么类型r.get(): Any导致这个? -
object TestTupleMatch extends App { val bd1 = BigDecimal(51302213.000000) val bd2 = BigDecimal(51302213.000000) (bd1, bd2) match { case (r0: BigDecimal, r1: BigDecimal) => println("matched") case (r0,r1) => println("Unable to compare [$r0] and [$r1]") } }上面的程序给出了匹配的结果。这意味着它可以正常工作。我使用 scala 2.12.4 和 java 1.8.0_144
标签: scala pattern-matching tuples