美文网首页Scala Tour
[译]Scala Case类

[译]Scala Case类

作者: steanxy | 来源:发表于2017-05-05 22:51 被阅读141次

Case类和常规类有几个关键差异。Case类适用于模型化不可变数据。之后会在模式匹配中展示如何使用Case类。

定义Case类

最简单的Case类只需要关键字case class,标识符和一个参数列表(可能为空):

case class Book(isbn: String)

val frankenstein = Book("978-0486282114")

注意,下面的示例没有使用new关键字实例化Message这个Case类。这是因为Case类默认有一个apply方法用于对象构造。

当使用参数创建Case类时,参数是public val

case class Message(sender: String, recipient: String, body: String)
val message1 = Message("guillaume@quebec.ca", "jorge@catalonia.es", "Ça va ?")

println(message1.sender)  // prints guillaume@quebec.ca
message1.sender = "travis@washington.us"  // this line does not compile

不能给message1.sender重新赋值,因为它时val(不可变的)。也可以在Case类中使用var,但是不建议这样做。

比较

Case类通过结构不是引用进行比较。

case class Message(sender: String, recipient: String, body: String)

val message2 = Message("jorge@catalonia.es", "guillaume@quebec.ca", "Com va?")
val message3 = Message("jorge@catalonia.es", "guillaume@quebec.ca", "Com va?")
val messagesAreTheSame = message2 == message3  // true

即便message2message3是不同的对象,但每个对象的值是相等的。

拷贝

只用copy方法可以创建一个Case类实例的深拷贝。可以随意改变构造函数的参数。

case class Message(sender: String, recipient: String, body: String)
val message4 = Message("julien@bretagne.fr", "travis@washington.us", "Me zo o komz gant ma amezeg")
val message5 = message4.copy(sender = message4.recipient, recipient = "claire@bourgogne.fr")
message5.sender  // travis@washington.us
message5.recipient // claire@bourgogne.fr
message5.body  // "Me zo o komz gant ma amezeg"

message4的收件人成为message5的发件人,但是message4的body被直接拷贝了。

相关文章

  • [译]Scala Case类

    Case类和常规类有几个关键差异。Case类适用于模型化不可变数据。之后会在模式匹配中展示如何使用Case类。 定...

  • case class

    Case Classes Scala 支持 case classes 记法。Case Class 就是普通的类, ...

  • [译]Scala类

    Scala中的类用于创建对象。类中可以包含方法,值,变量,类型,对象,特征以及类,统称为成员。类型,对象和特征稍后...

  • Scala 关于样例类的优点

    case class在匹配模式和actor中经常使用到,当一个类被定义成为case类后,Scala会自动帮你创建一...

  • Scala学习笔记 A2/L1篇 - 模式匹配和样例类 Patt

    教材:快学Scala chapter 14. 模式匹配和样例类 Pattern Matching and Case...

  • scala 模式匹配

    scala的模式匹配与java的switch case相似,但是switch case只能对值进行判断,scala...

  • Scala:样例类(case classes)

    1.概念理解 使用了case关键字的类定义就是样例类(case classes),样例类是种特殊的类。实现了类构造...

  • Java & Groovy & Scala & Kotlin -

    Overview 样本类是 Scala 中使用关键字 case class 声明的类。它可以隐式调用构造方法进行初...

  • [译]Scala泛型类

    泛型类是以一个类型作为参数的类。对于集合类特别有用。 定义泛型类 泛型类以一个类型作为参数,包含在[]中。试用字母...

  • 第十五讲 模式匹配和样例类

    本章要点 match case 类 scala有一个强大的模式匹配机制,可以应用在很多场合:switch语句、类型...

网友评论

    本文标题:[译]Scala Case类

    本文链接:https://www.haomeiwen.com/subject/jtzstxtx.html