5

可能重复:
在 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)

输出是:

0
0

为什么输出包含2乘以0?

如何修改此代码中的变量?

我有 Scala 版本 2.9.1。

4

3 回答 3

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用于定义方法的更改为valorvar就可以了:)

于 2012-11-01T20:56:18.363 回答
6

不容易被发现!这里:

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

你定义了一个名为person. 为了更清楚,您可以执行以下操作:

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

这意味着每次您说person的不是变量,而是调用方法并一遍又一遍地创建新实例。

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

信不信由你,这实际上是语言的一个特点。例如,您可以在您的类中创建一个字段 ( val),然后改变您的想法,只需将其更改为def. 从客户端代码的角度来看,没有任何变化。

于 2012-11-01T20:59:30.720 回答
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它,它现在将打印您传递给它的值。

于 2012-11-02T08:19:18.003 回答