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

时间:2018-12-28 07:54:29

标签: 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行的顺序之后,没有显示警告,并获得以下输出

汽车价格类型= Double

现在我的疑问是, 1)在两种情况下都应坚持“ Double”或“ Any”,但为什么不这样做呢? 2)为什么会引发警告?

3 个答案:

答案 0 :(得分:11)

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位于类型hierachy(最通用的类​​型)的顶部,它会消耗掉任何东西,这是您在之后得到警告无用代码的原因case price: Any

如果您在第5行中看到它说类型为any的案例价格,则该价格位于类型的最高级别。它将匹配任何Int,Flot,String,List或任何用户定义的数据类型。 这就是为什么案例价格下面的行:Any没有用,因为控件不会转到Any之后的下一个案例。

enter image description here

答案 1 :(得分:3)

case price: Any与包括Double在内的任何内容都匹配,因此如果在case price: Double之后则更新。

答案 2 :(得分:-1)

  1. 否,匹配大小写不间断,如果匹配某个条件并会返回
  2. 匹配情况要求:更精确的条件应该在前面