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