Scala - 值<不是AnyVal的成员

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)

它终于奏效了.这让我感到困惑,我想知道为什么?

Emi*_*l44 5

那是因为你的元组数组由两种不同的类型组成:Tuple2[String, Int]Tuple2[String, Double].这些类型由编译器推断,然后是元组数组的受干扰类型Tuple2[String, AnyVal].当您放置Double表示时,编译器能够创建Tuple2[String, Double].


Jam*_*ley 5

看看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.