在scala中使用def,val和var

class Person(val name:String,var age:Int )def person = new Person("Kumar",12)person.age = 20println(person.age)

这些代码行输出12,即使person.age=20已成功执行。我发现这是因为我使用了def def person = new Person("Kumar",12)。如果我使用var或val,则输出为20。我理解scala中的默认值是val。这个:

def age = 30age = 45

...给出编译错误,因为它默认为val。为什么上面的第一组行不能正常工作,而且还没有错误?


回首忆惘然
浏览 875回答 3
3回答

MM们

在Scala中有三种定义方法:def定义一个方法val定义一个固定值(不能修改)var定义一个变量(可以修改)看看你的代码:def person = new Person("Kumar",12)这定义了一个名为的新方法person。您可以只调用此方法,()因为它被定义为无参数方法。对于empty-paren方法,你可以使用或不使用'()'来调用它。如果你只是写:person那么你正在调用这个方法(如果你没有分配返回值,它将被丢弃)。在这行代码中:person.age = 20会发生什么是你首先调用person方法,并在返回值(类的实例Person)上更改age成员变量。最后一行:println(person.age)在这里,您再次调用该person方法,该方法返回一个新的类实例Person(age设置为12)。它与此相同:println(person().age)

慕侠2389804

我首先介绍了def,val和var之间Scala中存在的区别。def&nbsp;-&nbsp;为懒惰评估的右侧内容定义不可变标签&nbsp;- 按名称评估。val&nbsp;-&nbsp;为急剧/立即评估的右侧内容定义不可变标签&nbsp;- 按值评估。var&nbsp;- 定义一个可变变量,最初设置为评估的右侧内容。例如,defscala>&nbsp;def&nbsp;something&nbsp;=&nbsp;2&nbsp;+&nbsp;3&nbsp;*&nbsp;4&nbsp;something:&nbsp;Intscala>&nbsp;something&nbsp;&nbsp;//&nbsp;now&nbsp;it's&nbsp;evaluated,&nbsp;lazily&nbsp;upon&nbsp;usageres30:&nbsp;Int&nbsp;=&nbsp;14例如,valscala>&nbsp;val&nbsp;somethingelse&nbsp;=&nbsp;2&nbsp;+&nbsp;3&nbsp;*&nbsp;5&nbsp;//&nbsp;it's&nbsp;evaluated,&nbsp;eagerly&nbsp;upon&nbsp;definitionsomethingelse:&nbsp;Int&nbsp;=&nbsp;17例子,varscala>&nbsp;var&nbsp;aVariable&nbsp;=&nbsp;2&nbsp;*&nbsp;3aVariable:&nbsp;Int&nbsp;=&nbsp;6scala>&nbsp;aVariable&nbsp;=&nbsp;5aVariable:&nbsp;Int&nbsp;=&nbsp;5根据上面的说法,def和val的标签不能重新分配,如果有任何尝试,将引发如下所示的错误:scala>&nbsp;something&nbsp;=&nbsp;5&nbsp;*&nbsp;6<console>:8:&nbsp;error:&nbsp;value&nbsp;something_=&nbsp;is&nbsp;not&nbsp;a&nbsp;member&nbsp;of&nbsp;object&nbsp;$iw &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;something&nbsp;=&nbsp;5&nbsp;*&nbsp;6 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;^当类被定义为:scala>&nbsp;class&nbsp;Person(val&nbsp;name:&nbsp;String,&nbsp;var&nbsp;age:&nbsp;Int)defined&nbsp;class&nbsp;Person然后实例化:scala>&nbsp;def&nbsp;personA&nbsp;=&nbsp;new&nbsp;Person("Tim",&nbsp;25)personA:&nbsp;Person一个不可变的标签被用于人(即“人物角色)的该特定实例创建的。每当需要修改可变字段'age'时,此类尝试将失败:scala>&nbsp;personA.age&nbsp;=&nbsp;44personA.age:&nbsp;Int&nbsp;=&nbsp;25正如预期的那样,'年龄'是不可变标签的一部分。处理此问题的正确方法包括使用可变变量,如下例所示:scala>&nbsp;var&nbsp;personB&nbsp;=&nbsp;new&nbsp;Person("Matt",&nbsp;36)personB:&nbsp;Person&nbsp;=&nbsp;Person@59cd11fe scala>&nbsp;personB.age&nbsp;=&nbsp;44personB.age:&nbsp;Int&nbsp;=&nbsp;44&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;value&nbsp;re-assigned,&nbsp;as&nbsp;expected很明显,从可变变量引用(即'personB')可以修改类可变字段'age'。我仍然会强调,所有内容都来自上述差异,任何Scala程序员都必须清楚这一点。

慕的地8271018

同def&nbsp;person&nbsp;=&nbsp;new&nbsp;Person("Kumar",&nbsp;12)你正在定义一个函数/惰性变量,它总是返回一个名为“Kumar”且年龄为12的新Person实例。这是完全有效的,编译器没有理由抱怨。调用person.age将返回此新创建的Person实例的年龄,该实例始终为12。写作时person.age&nbsp;=&nbsp;45您为类Person中的age属性分配一个新值,该值有效,因为age声明为var。如果您尝试person使用新的Person对象重新分配,编译器会抱怨person&nbsp;=&nbsp;new&nbsp;Person("Steve",&nbsp;13)&nbsp;&nbsp;//&nbsp;Error
打开App,查看更多内容
随时随地看视频慕课网APP