可能重复:
在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
这花了我一点时间才意识到:)
您没有定义一个val或var"人",而是创建一个新方法 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你会没事:)
不容易发现!这里:
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.从客户端代码的角度来看,没有什
| 归档时间: |
|
| 查看次数: |
3004 次 |
| 最近记录: |