了解Scala中的Case类

时间:2018-11-14 23:11:29

标签: scala

我有下面的代码,但是当我删除case语句时,对象instance(Donut)无法引用。我想用类和案例类语句的简单示例来理解,请指教。我也想了解为什么在我的第二个打印语句中打印'('')'。

 case class Donut(name: String, tasteLevel: String)

   val favoriteDonut2: Donut = Donut("Glazed Donut", "Very Tasty")
   println(s"My favorite donut name = ${favoriteDonut2.name}, 
          tasteLevel =  ${favoriteDonut2.tasteLevel}")
   println( s"My fav donut name is = ${favoriteDonut2.name}",
            s"taste level is       = ${favoriteDonut2.tasteLevel}")

output:-
   My favorite donut name = Glazed Donut, tasteLevel = Very Tasty
   (My fav donut name is = Glazed Donut,taste level is     = Very Tasty)

1 个答案:

答案 0 :(得分:1)

调用Donut("Glazed Donut", "Very Tasty")时,实际上是在调用apply 对象中的Donut 方法
当您将某个类标记为case class时,scala会自动为您生成一堆东西,在它们之间为您的类提供一个 companion对象,其中有一个apply方法,该方法接受您定义的所有参数。
这就是为什么如果仅将其定义为普通类,则该行将失败-您可以改为调用new Donut("Glazed Donut", "Very Tasty")。或者,您可以手动创建apply方法。

class Donut(val name: String, val tasteLevel: String) // vals needed to make the fields public, case classes do this by default.
object Donut {
  /** Factory of Donuts */
  def apply(name: String, tasteLevel: String): Donut = new Donut(name, tasteLevel)
}

注意

Case Classes提供了一系列简单构造函数的有用功能,例如:漂亮的toString实现,好的hashCode实现,“按值” 比较,用于模式匹配的简单“复制” 提取器-删除了“样板” < / em>。
因此,如果您需要这些功能中的几个,并且该类不打算被更改,则最好使用 case类,而不是自己实现所有功能。

  

“另外我想了解为什么在第二个打印语句中打印'('')'。”

Scala的print函数仅接收一个参数。因此,写print(a, b)时发生的是,您用元组(a, b)-(与调用print((a, b))相同)来调用print