Fel*_*x J 5 functional-programming scala
这是我的代码.我在第二个案例中遇到了编译错误:
错误:(92,26)值<不是AnyVal案例x的成员,如果x._2 <2 =>"价格低于2"
def tupleMatch: Unit = {
val donut = Tuple2("Donut", 2.5)
val plain = Tuple2("Plain", 1.0)
val tuples = List(donut, plain)
tuples.foreach { tuple =>
val toPrint = tuple match {
case ("Donut", price) => s"price of Donut is ${donut._2}"
case (_, price) if price < 2 => "price under 2"
case _ => "other"
}
println(toPrint)
}
}
Run Code Online (Sandbox Code Playgroud)
我改变之后
val plain = Tuple2("Plain", 1)
Run Code Online (Sandbox Code Playgroud)
至
val plain = Tuple2("Plain", 1.0)
Run Code Online (Sandbox Code Playgroud)
它终于奏效了.这让我感到困惑,我想知道为什么?
那是因为你的元组数组由两种不同的类型组成:Tuple2[String, Int]和Tuple2[String, Double].这些类型由编译器推断,然后是元组数组的受干扰类型Tuple2[String, AnyVal].当您放置Double表示时,编译器能够创建Tuple2[String, Double].
看看REPL:
scala> val donut = Tuple2("Donut", 2.5)
donut: (String, Double) = (Donut,2.5)
scala> val plain = Tuple2("Plain", 1.0)
plain: (String, Double) = (Plain,1.0)
scala> val tuples = List(donut, plain)
tuples: List[(String, Double)] = List((Donut,2.5), (Plain,1.0))
Run Code Online (Sandbox Code Playgroud)
因为两个元组具有相同的类型(String, Double),所以List是类型List[(String, Double)].<是Double的有效函数.
当您将plain定义为Tuple2("Plain",1)时,两个元组的第二部分具有不同的类型(Intvs Double),因此生成的List是List[(String, AnyVal)]:
scala> val donut = Tuple2("Donut", 2.5)
donut: (String, Double) = (Donut,2.5)
scala> val plain = Tuple2("Plain", 1)
plain: (String, Int) = (Plain,1)
scala> val tuples = List(donut, plain)
tuples: List[(String, AnyVal)] = List((Donut,2.5), (Plain,1))
Run Code Online (Sandbox Code Playgroud)
...并且<不是有效的功能AnyVal.
| 归档时间: |
|
| 查看次数: |
368 次 |
| 最近记录: |