在Scala中使用def、val和var

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (15)
class Person(val name:String,var age:Int )
def person = new Person("Kumar",12)
person.age = 20
println(person.age)

这些代码行输出12尽管person.age=20被成功执行。

用了def person = new Person("Kumar",12)。如果我使用var或val,输出是20。我理解Scala中默认的Val。这是:

def age = 30
age = 45

会产生编译错误,因为默认情况下它是VAL。为什么上面的第一组行不能正常工作,同时也不会出错?

提问于
用户回答回答于

示例,def

scala> def something = 2 + 3 * 4 
something: Int
scala> something  // now it's evaluated, lazily upon usage
res30: Int = 14

例如,Val

scala> val somethingelse = 2 + 3 * 5 // it's evaluated, eagerly upon definition
somethingelse: Int = 17

例如,var

scala> var aVariable = 2 * 3
aVariable: Int = 6

scala> aVariable = 5
aVariable: Int = 5

如果有任何尝试,将引发如下错误:

scala> something = 5 * 6
<console>:8: error: value something_= is not a member of object $iw
       something = 5 * 6
       ^

当类被定义为:

scala> class Person(val name: String, var age: Int)
defined class Person

然后实例化如下:

scala> def personA = new Person("Tim", 25)
personA: Person

该特定的Person实例(即“角色”)创建。每当需要修改可变字段“AGE”时,这种尝试都失败:

scala> personA.age = 44
personA.age: Int = 25

正如预期的那样,“年龄”是不可更改标签的一部分。正确的处理方法是使用可变变量,如下例所示:

scala> var personB = new Person("Matt", 36)
personB: Person = Person@59cd11fe

scala> personB.age = 44
personB.age: Int = 44    // value re-assigned, as expected

很清楚,从可变变量参考(即“PersonB”)可以修改类可变字段‘age’。

用户回答回答于

在Scala中有三种定义事物的方法:

  • def定义方法
  • val定义一个固定的价值(不能修改)
  • var定义变量(可修改)

查看代码:

def person = new Person("Kumar",12)

这定义了一个名为person。您只能调用此方法()因为它被定义为无参数方法。对于空-Pren方法,可以使用“()”调用它,也可以不使用“()”调用它。如果你只写:

person

然后调用此方法(如果不分配返回值,则它将被丢弃)。在这一行代码中:

person.age = 20

发生的情况是,首先调用person方法,以及返回值(类的实例)。Person正在更改age成员变量

最后一行:

println(person.age)

在这里,你又一次打电话给person方法,该方法返回类的新实例。Person(与age设为12)。就像这样:

println(person().age)

扫码关注云+社区