将setter方法添加到scala类

时间:2015-10-29 23:02:50

标签: scala class setter

我正在读一本书“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方法的用法?

2 个答案:

答案 0 :(得分:1)

我不确定def age_ = (newAge: Int) = _age = newAge的上下文或作者试图用该行演示的内容。默认情况下,构造函数的参数是公共的,因此删除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

答案 1 :(得分:-1)

看起来唯一的问题是印记错误&#39; &#39; (&#39;空格&#39;)&#39;下划线&#39;之间的错误线的simbol和#等于&#39;。 正确的代码是:

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

让我们删除语法糖(加上abit经典格式化),我们将有更清晰的方法,它实际上是&#34;变量&#34; age&#34;支持&#34;到private var _age

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

将这些变量视为类似于虚拟的变量:此setter具有先前定义的getter,但可能根本没有存储。例如,两者都使用HTTP请求(GET&amp; PUT)来存储/检索值。)

所以,第一个&#39; =&#39;实际上是方法名称age_=的一部分,它是Scala用于为age定义setter的语法。