为了账号安全,请及时绑定邮箱和手机立即绑定

在scala中使用def,val和var

在scala中使用def,val和var

回首忆惘然 2019-09-19 09:37:37
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。为什么上面的第一组行不能正常工作,而且还没有错误?
查看完整描述

3 回答

?
MM们

TA贡献1886条经验 获得超2个赞

在Scala中有三种定义方法:

  • def定义一个方法

  • val定义一个固定(不能修改)

  • var定义一个变量(可以修改)

看看你的代码:

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

这定义了一个名为的新方法person。您可以只调用此方法,()因为它被定义为无参数方法。对于empty-paren方法,你可以使用或不使用'()'来调用它。如果你只是写:

person

那么你正在调用这个方法(如果你没有分配返回值,它将被丢弃)。在这行代码中:

person.age = 20

会发生什么是你首先调用person方法,并在返回值(类的实例Person)上更改age成员变量。

最后一行:

println(person.age)

在这里,您再次调用该person方法,该方法返回一个新的类实例Personage设置为12)。它与此相同:

println(person().age)


查看完整回答
反对 回复 2019-09-19
?
慕侠2389804

TA贡献1719条经验 获得超6个赞

我首先介绍了defvalvar之间Scala中存在的区别。

  • def - 为懒惰评估的右侧内容定义不可变标签 - 按名称评估。

  • val - 为急剧/立即评估的右侧内容定义不可变标签 - 按值评估。

  • var - 定义一个可变变量,最初设置为评估的右侧内容。

例如,def

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

例如,val

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

例子,var

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

根据上面的说法,defval的标签不能重新分配,如果有任何尝试,将引发如下所示的错误:

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

一个不可变的标签被用于人(即“人物角色)的该特定实例创建的。每当需要修改可变字段'age'时,此类尝试将失败:

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

正如预期的那样,'年龄'是不可变标签的一部分。处理此问题的正确方法包括使用可变变量,如下例所示:

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

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

很明显,从可变变量引用(即'personB')可以修改类可变字段'age'。

我仍然会强调,所有内容都来自上述差异,任何Scala程序员都必须清楚这一点。


查看完整回答
反对 回复 2019-09-19
?
慕的地8271018

TA贡献1796条经验 获得超4个赞

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

你正在定义一个函数/惰性变量,它总是返回一个名为“Kumar”且年龄为12的新Person实例。这是完全有效的,编译器没有理由抱怨。调用person.age将返回此新创建的Person实例的年龄,该实例始终为12。

写作时

person.age = 45

您为类Person中的age属性分配一个新值,该值有效,因为age声明为var。如果您尝试person使用新的Person对象重新分配,编译器会抱怨

person = new Person("Steve", 13)  // Error


查看完整回答
反对 回复 2019-09-19
  • 3 回答
  • 0 关注
  • 872 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信