簡體   English   中英

Scala中Case類的理解

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM