Scala:如何通过方法修改类中的某些变量?

Mar*_*iuk 5 scala var class

可能重复:
在scala中使用def,val和var

我现在正在学习Scala,我不能在课堂上修改变量.

class Person(name: String, var variable: Int) {
  def change() {
    variable = 42
  }
}
def person = new Person("name", 0)
println(person.variable)
person.change()
println(person.variable)
Run Code Online (Sandbox Code Playgroud)

输出是:

0
0
Run Code Online (Sandbox Code Playgroud)

为什么输出包含2次0?

我如何修改本代码中的变量?

我有Scala版本2.9.1.

fre*_*oma 12

这花了我一点时间才意识到:)

您没有定义一个valvar"人",而是创建一个新方法 person.因此,每次调用时person,它都会创建一个新实例Person,该实例的variable设置始终为0.这是一个副作用,即在Scala中您不需要()调用无参数方法.

def person = new Person("foo", 1)
Run Code Online (Sandbox Code Playgroud)

大致相当于(在Java代码中)

public Person person() {
    return new Person("foo", 1);
}
Run Code Online (Sandbox Code Playgroud)

val person你想要的是,即

Person person = new Person("foo", 1)
Run Code Online (Sandbox Code Playgroud)

(当然这不是真的,val因为Scala不支持那些:))

当你使用时person,Scala理解的是什么person().

只是改变def,用于定义方法,val或者var你会没事:)


Tom*_*icz 5

不容易发现!这里:

def person = new Person("name", 0)
Run Code Online (Sandbox Code Playgroud)

你定义一个名为的方法person.为了更清楚,你做这样的事情:

def person(): Person = {
  return new Person("name", 0)
}
Run Code Online (Sandbox Code Playgroud)

这意味着每当你说person你不是指一个变量而是调用一个方法并一遍又一遍地创建新实例时.

只说val person =...你会没事的.

信不信由你,这实际上是语言的一个特征.例如,您可以val在班级中创建一个field(),然后通过简单地更改为改变主意并将其转换为getter def.从客户端代码的角度来看,没有什