[英]Understanding of Case class in Scala
我有以下代碼,但是當我刪除 case 語句時,對象實例(甜甜圈)無法引用。 我想用類和案例類聲明的簡單例子來理解,請指教。 我也想了解為什么在我的第二個打印語句中打印 '(' ')' 。
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)
當您調用Donut("Glazed Donut", "Very Tasty")
您實際上是在調用Donut
對象的apply
方法。
當你將一個類標記為case class
,scala 會自動為你生成一堆東西,在它們之間為你的類生成一個伴生對象,其中一個 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)
}
案例類提供了簡單構造函數的另一組有用功能,例如:漂亮的toString
實現、良好的hashCode
實現、 “按值”比較、簡單的“復制” 、模式匹配提取器等- 從代碼中刪除“樣板” .
因此,如果您需要這些功能中的幾個,並且該類不打算進行變異,那么寧願使用case 類而不是自己實現所有內容。
“我還想了解為什么在我的第二個打印語句中打印了 '(' ')'。”
Scala 的print
函數,只接收一個參數。 因此,當您編寫print(a, b)
時會發生什么是您使用元組(a, b)
- (這與調用print((a, b))
)一起調用print((a, b))
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.