可能重复:在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 .
3 回答
不容易发现!这里:
您定义名为
person
的方法 . 为了更清楚,你做这样的事情:这意味着每次你说
person
你都没有引用变量,而是调用方法并反复创建新实例 .只要说
val person =
......你就没事了 .信不信由你,这实际上是语言的一个特征 . 例如 . 您可以在 class 中创建一个字段(
val
),然后通过简单地更改为def
来改变主意并将其转换为吸气剂 . 从客户端代码的角度来看,没有什让我们一块一块地分析你的代码 . 首先,你宣布了一个名为person的类 .
class Person(name: String, var variable: Int)
有2个参数,名称和变量 . 在此类下,您有一个名为def change()
的方法 .它有一个变量,其值为42 . 然后你通过
person.change()
调用def change()
方法这
person.change()
实际上并没有改变varvariable
的值,但实际上是调用它自己的方法 . 尝试做println(person.change())
,你会看到它将打印"42" .我猜,你还是不明白class和def之间的区别 . 如果要更改
class Person
的值,则需要新的def来调用更改 .现在调用
defChangePerson
,它现在将打印您传递给它的值 .这花了我一点时间才意识到:)
您没有定义
val
或var
"person",而是创建新方法person
. 因此,每次调用person
时,它都会创建Person
的新实例,该实例的variable
始终设置为0
. 这是一个副作用,在Scala中你不需要()
来调用无参数方法 .大致相当于(在Java代码中)
而
val person
是你想要的,即(当然这不是真正的
val
因为Scala不支持那些:))然后当你使用
person
时,Scala理解的是person()
.只需将用于定义方法的
def
更改为val
或var
,你就可以了:)