Skip to content

Commit 8454496

Browse files
authored
Merge pull request #1174 from declan94/case_class
zh-cn for Scala Tour:Case Classes
2 parents 51c0ef1 + 72b73fc commit 8454496

File tree

1 file changed

+46
-1
lines changed

1 file changed

+46
-1
lines changed

_zh-cn/tour/case-classes.md

+46-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
layout: tour
3-
title: Case Classes
3+
title: 案例类(Case Classes
44

55
discourse: false
66

@@ -13,3 +13,48 @@ language: zh-cn
1313
next-page: pattern-matching
1414
previous-page: multiple-parameter-lists
1515
---
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("[email protected]", "[email protected]", "Ça va ?")
32+
33+
println(message1.sender) // prints [email protected]
34+
message1.sender = "[email protected]" // 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("[email protected]", "[email protected]", "Com va?")
44+
val message3 = Message("[email protected]", "[email protected]", "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("[email protected]", "[email protected]", "Me zo o komz gant ma amezeg")
54+
val message5 = message4.copy(sender = message4.recipient, recipient = "[email protected]")
55+
message5.sender // [email protected]
56+
message5.recipient // [email protected]
57+
message5.body // "Me zo o komz gant ma amezeg"
58+
```
59+
上述代码指定`message4``recipient`作为`message5``sender`,指定`message5``recipient`为"[email protected]",而`message4``body`则是直接拷贝作为`message5``body`了。
60+

0 commit comments

Comments
 (0)