scala - Scala 模式匹配中无法访问的代码

标签 scala

执行下面的代码

println("Pattern Matching by type")

val priceofCar : Any = 2.0
val priceType = priceofCar match{

    case price: Int => "Int"       // 1
    case price: Float => "Float"   // 2
    case price: Any => "Any"       // 3
    case price: Double => "Double" // 4
    case _ => "others"             // 5
}
// println(:type priceofCar)
println(s"Car price type = $priceType")

最终得到以下输出

汽车价格类型 = 任何

和警告信息

警告:无法访问的代码
案例价格:Double => "Double"//4
^
发现一个警告。

但是,在交换行//3 和//4 的顺序后,没有显示警告并获得以下输出

车价类型 = 双倍

现在我的疑问是,
1)在这两种情况下它都应该坚持“双倍”或“任何”,但不是为什么?
2)为什么会抛出警告?

最佳答案

val priceType = priceofCar match{

    case price: Int => "Int"       // 1
    case price: Float => "Float"   // 2
    case price: Any => "Any"       // 3
    case price: Double => "Double" // 4
    case _ => "others"             // 5
}

模式匹配是顺序匹配的,这意味着它首先将价格与第一种情况匹配,即价格:Int 然后 Float 然后 Any 等等。

我们应该首先保留最具体的类型,正如我们在图中看到的,Any 位于类型层次结构(最通用的类​​型)的顶部,它可以消耗任何东西,这就是您在 case price: Any 之后的行收到警告无用代码的原因。

如果您在第 5 行看到,它表示 any 类型的 case price 位于这些类型的hierachy 的顶部。它将匹配任何 Int、Flot、String、List 或任何用户定义的数据类型。
这就是为什么 case price:Any 下面的行没有用,因为控制不会在 Any 之后进入下一个 case。

enter image description here

关于scala - Scala 模式匹配中无法访问的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53955327/

相关文章:

mysql - 尝试添加 MySQL/slick 后出现奇怪的 Play Framework 2.2 异常

java - 如何将Akka的监督策略与更具体的不可恢复错误处理结合起来?

java - 如何从 Map scala 获取 key (无论大小写)

Scala - 最终超时和 Thread.sleep() 之间的区别

scala - 使用 Pyspark 删除表

scala - Play Framework 2 模板表单 None.get

java - ZonedDateTime.parse 错误?

scala - self 类型和特质子类有什么区别?

scala - 在 Spark Scala 中编码时出现 ArrayIndexOutOfBoundsException

scala - 在 f 字符串插值中转义引号