【问题标题】:Are constructor parameters treated differently in classes vs. case classes?构造函数参数在类和案例类中的处理方式不同吗?
【发布时间】:2021-05-07 20:49:38
【问题描述】:

在《Scala 编程第 5 版》一书中,在第四章中提到,如果一个类是一个案例类,我们可以使用以下方式创建类的对象:

scala> case class Person(name: String, age: Int)
// defined case class Person

scala> val p = Person("Sally", 39)
val p: Person = Person(Sally,39)

我觉得和下面的正常方式没有什么不同:

scala> class Person(name: String, age: Int)
// defined class Person

scala> val p = Person("Aviral", 24)
val p: Person = Person@7f5fcfe9

我尝试在这两种情况下访问对象,但存在差异。当我声明与 case 类相同的类时,我可以访问其成员:p.namep.age 而如果我尝试对 通常 声明的类执行相同操作,我会得到以下错误:

1 |p.name
  |^^^^^^
  |value name cannot be accessed as a member of (p : Person) from module class rs$line$3$.

就构造对象而言,这两种情况有何不同?

【问题讨论】:

  • 您查看here找到的答案了吗?
  • @jwvh 我正在考虑单击您的链接并将其作为重复链接关闭。但是,我只发现了 2010 年、2013 年、2017 年某人模糊相关的过于宽泛的答案的一堵可怕的长墙,我不知道还有什么时候。我认为建议询问 Scala-3 的新人阅读自 2010 年以来编写的所有内容没有帮助。
  • 这个here也不是很好的复制品,因为它有不同的焦点。
  • @MarioGalic 看起来不错。如果 Aviral 同意这回答了问题,我建议将其作为重复项关闭。

标签: scala case-class scala-3


【解决方案1】:

正如Tour Of ScalaScala 3 book 所说

当你创建一个带参数的案例类时,参数是公共的vals。

因此,在

case class Person(name: String, age: Int)

nameage 都将是公开的,这与普通课程不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 2011-11-09
    • 1970-01-01
    • 2015-02-01
    • 2016-04-06
    相关资源
    最近更新 更多