我有下面的代码,但是当我删除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)
答案 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 。