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

时间:2012-11-01 20:50:25

标签: class scala var

  

可能重复:
  Use of def, val, and var in scala

我现在正在学习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)

输出是:

0
0

为什么输出包含2次0?

如何修改本规范中的变量?

我有Scala版本2.9.1。

3 个答案:

答案 0 :(得分:12)

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

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

def person = new Person("foo", 1)

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

public Person person() {
    return new Person("foo", 1);
}

val person是你想要的,即

Person person = new Person("foo", 1)

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

然后当您使用person时,Scala明白的是person()

只需将用于定义方法的def更改为valvar,您就可以了:)

答案 1 :(得分:5)

不容易发现!这里:

def person = new Person("name", 0)

您定义了一个名为person的方法。为了更清楚,你可以这样做:

def person(): Person = {
  return new Person("name", 0)
}

这意味着每次你说person时你都没有引用变量,而是调用方法并反复创建新实例。

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

信不信由你,这实际上是语言的一个特征。例如。您可以在班级中创建一个字段(val),然后只需更改为def即可改变主意并将其转换为getter。从客户端代码的角度来看,没有任何变化。

答案 2 :(得分:0)

让我们一块一块地分析你的代码。 首先,你宣布了一个名为person的类。 class Person(name: String, var variable: Int) 有2个参数,名称和变量。 在此类下,您有一个名为def change()的方法。

它有一个变量,其值为42。 然后,您按def change()

调用了person.change()方法

这个person.change()实际上并没有改变var variable的值,但实际上是在调用自己的方法。 尝试执行println(person.change()),您会看到它会打印“42”。

我猜,你还是不明白class和def之间的区别。 如果您想更改class Person的值,则需要新的def来调用更改。

 class Person(name: String, var variable: Int) {
  println(variable)
}
def changePerson = Person("new value of name here", "new value of variable here");

现在调用defChangePerson,现在它将打印您传递给它的值。