首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在scala中使用def、val和var

在scala中使用def、val和var
EN

Stack Overflow用户
提问于 2010-12-14 16:52:49
回答 3查看 103.1K关注 0票数 163
代码语言:javascript
复制
class Person(val name:String,var age:Int )
def person = new Person("Kumar",12)
person.age = 20
println(person.age)

即使成功执行了person.age=20,这些代码行也会输出12。我发现发生这种情况是因为我在def person = new Person("Kumar",12)中使用了def。如果我使用var或val,则输出为20。我知道在scala中默认的是val。这一点:

代码语言:javascript
复制
def age = 30
age = 45

...gives一个编译错误,因为默认情况下它是val。为什么上面的第一组代码行不能正常工作,但也没有错误?

EN

回答 3

Stack Overflow用户

发布于 2010-12-14 16:59:51

使用

代码语言:javascript
复制
def person = new Person("Kumar", 12) 

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

在写的时候

代码语言:javascript
复制
person.age = 45

您为Person类中的age属性分配了一个新值,由于age声明为var,因此该值是有效的。如果您尝试使用新的Person对象重新分配person,编译器将会报错

代码语言:javascript
复制
person = new Person("Steve", 13)  // Error
票数 29
EN

Stack Overflow用户

发布于 2010-12-14 19:33:47

正如Kintaro已经说过的,person是一个方法(因为def),并且总是返回一个新的Person实例。正如您发现的那样,如果您将方法更改为var或val,它将会起作用:

代码语言:javascript
复制
val person = new Person("Kumar",12)

另一种可能性是:

代码语言:javascript
复制
def person = new Person("Kumar",12)
val p = person
p.age=20
println(p.age)

但是,代码中的person.age=20是允许的,因为您从person方法中返回了一个Person实例,并且在这个实例上,您可以更改var的值。问题是,在那一行之后,您不再有对该实例的引用(因为每次调用person都会生成一个新实例)。

这没什么特别的,您在Java中会有完全相同的行为:

代码语言:javascript
复制
class Person{ 
   public int age; 
   private String name;
   public Person(String name; int age) {
      this.name = name;  
      this.age = age;
   }
   public String name(){ return name; }
}

public Person person() { 
  return new Person("Kumar", 12); 
}

person().age = 20;
System.out.println(person().age); //--> 12
票数 20
EN

Stack Overflow用户

发布于 2010-12-15 01:20:18

让我们看一下这个:

代码语言:javascript
复制
class Person(val name:String,var age:Int )
def person =new Person("Kumar",12)
person.age=20
println(person.age)

并用等价的代码重写它

代码语言:javascript
复制
class Person(val name:String,var age:Int )
def person =new Person("Kumar",12)
(new Person("Kumar", 12)).age_=(20)
println((new Person("Kumar", 12)).age)

看,def是一种方法。它将在每次调用时执行,并且每次都将返回(a) new Person("Kumar", 12)。这些在“赋值”中没有错误,因为它不是真正的赋值,而只是对age_=方法(由var提供)的调用。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4437373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档