我现在正在学习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。
答案 0 :(得分:12)
我花了一些时间才意识到:)
您没有定义val
或var
“人”,而是创建新的方法 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
更改为val
或var
,您就可以了:)
答案 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
,现在它将打印您传递给它的值。