将 setter 方法添加到 Scala class

Add setter method to a scala class

我正在读一本书 "Scala in action" 来学习 scala。在第 59 页,作者提供了以下代码。但是当我 运行 它时,它没有编译。

class Person(var firstName:String, var lastName:String, private var _age:Int) {
  def age = _age
  def age_ = (newAge: Int) = _age = newAge //Error
}

报告:

<console>:3: ';' expected but '=' found. def age_ = (newAge: Int) = _age = newAge}

本书使用scala 2.10。我正在使用 scala 2.11。

scala 是否更改了 2.11 中 setter 方法的用法?

我不确定 def age_ = (newAge: Int) = _age = newAge 的上下文是什么,或者作者试图用该行演示什么。默认情况下,构造函数的参数是 public,因此删除 private 允许您免费使用 setter。

scala> class Person(var firstName:String, var lastName:String, var _age:Int) {}
defined class Person

scala> val bob = new Person("Bob", "Smith", 42)
bob: Person = Person@290d210d

scala> bob._age = 43
bob._age: Int = 43

scala> bob._age
res9: Int = 43

看起来唯一的问题是 'underscore' 和 'equals' 之间错误行的错误打印 ' ' ('space') 符号。 正确的代码是:

  def age_= (newAge: Int) = _age = newAge //NO Error

让我们删除语法糖(加上 abit 经典格式),我们将有更清晰的方法,这实际上是 setter for "variable" age "backed" to private var _age

  def age_=(newAge: Int): Unit = {
    _age = newAge
  }

考虑这样的变量,就好像它是虚拟的一样:这个 setter 具有先前定义的 getter 但可能根本没有存储。例如,两者都使用 HTTP 请求(GET 和 PUT)到 store/retrieve 值)。

因此,第一个 '=' 实际上是方法名称 age_= 的一部分,它是 Scala 用来为 age.

定义 setter 的语法