1
1
---
2
2
layout: tour
3
- title: Case Classes
3
+ title: 案例类( Case Classes)
4
4
5
5
discourse: false
6
6
@@ -13,3 +13,48 @@ language: zh-cn
13
13
next-page: pattern-matching
14
14
previous-page: multiple-parameter-lists
15
15
---
16
+
17
+ 案例类(Case classes)和普通类差不多,只有几点关键差别,接下来的介绍将会涵盖这些差别。案例类非常适合用于不可变的数据。下一节将会介绍他们在[模式匹配](pattern-matching.html)中的应用。
18
+
19
+ ## 定义一个案例类
20
+ 一个最简单的案例类定义由关键字`case class`,类名,参数列表(可为空)组成:
21
+ ```tut
22
+ case class Book(isbn: String)
23
+
24
+ val frankenstein = Book("978-0486282114")
25
+ ```
26
+ 注意在实例化案例类`Book`时,并没有使用关键字`new`,这是因为案例类有一个默认的`apply`方法来负责对象的创建。
27
+
28
+ 当你创建包含参数的案例类时,这些参数是公开(public)的`val`
29
+ ```
30
+ case class Message(sender: String, recipient: String, body: String)
31
+ val message1 = Message("guillaume@quebec.ca", "jorge@catalonia.es", "Ça va ?")
32
+
33
+ println(message1.sender) // prints guillaume@quebec.ca
34
+ message1.sender = "travis@washington.us" // this line does not compile
35
+ ```
36
+ 你不能给`message1.sender`重新赋值,因为它是一个`val`(不可变)。在案例类中使用`var`也是可以的,但并不推荐这样。
37
+
38
+ ## 比较
39
+ 案例类在比较的时候是按值比较而非按引用比较:
40
+ ```
41
+ case class Message(sender: String, recipient: String, body: String)
42
+
43
+ val message2 = Message("jorge@catalonia.es", "guillaume@quebec.ca", "Com va?")
44
+ val message3 = Message("jorge@catalonia.es", "guillaume@quebec.ca", "Com va?")
45
+ val messagesAreTheSame = message2 == message3 // true
46
+ ```
47
+ 尽管`message2`和`message3`引用不同的对象,但是他们的值是相等的,所以`message2 == message3`为`true`。
48
+
49
+ ## 拷贝
50
+ 你可以通过`copy`方法创建一个案例类实例的浅拷贝,同时可以指定构造参数来做一些改变。
51
+ ```
52
+ case class Message(sender: String, recipient: String, body: String)
53
+ val message4 = Message("julien@bretagne.fr", "travis@washington.us", "Me zo o komz gant ma amezeg")
54
+ val message5 = message4.copy(sender = message4.recipient, recipient = "claire@bourgogne.fr")
55
+ message5.sender // travis@washington.us
56
+ message5.recipient // claire@bourgogne.fr
57
+ message5.body // "Me zo o komz gant ma amezeg"
58
+ ```
59
+ 上述代码指定`message4`的`recipient`作为`message5`的`sender`,指定`message5`的`recipient`为"claire@bourgogne.fr",而`message4`的`body`则是直接拷贝作为`message5`的`body`了。
60
+
0 commit comments