gpt4 book ai didi

scala - Scala 中类参数声明的区别

转载 作者:行者123 更新时间:2023-12-02 00:33:18 25 4
gpt4 key购买 nike

谁能帮我理解以下两个声明

class Person1(name: String, id: Int) { }
class Person2(val name: String, val id: Int) { }
val p1 = new Person1("personOne", 1)
val p2 = new Person2("personTwo", 2)
println(p1.name) // ERROR
println(p2.name) // OK!!

我知道默认情况下参数是 val 。为什么第一个 p1 能够返回数据而 p2 不能做同样的事情

最佳答案

正式从 Scala 规范开始:

The scope of a formal value parameter includes all subsequent parameter sections and the template t. However, a formal value parameter may not form part of the types of any of the parent classes or members of the class template t. It is illegal to define two formal value parameters with the same name.

参数部分和模板 t 基本上描述了整个类范围。

在Scala的JVM实现上,当你在Scala中创建一个类并且没有指定val关键字时,编译器会将字段的作用域设置为private[this] 并且不会为外部可见性创建匹配方法。意思是(感谢@Duelist 的措辞)这些值仅在封闭类的范围内(这包括类方法和任何惰性字段),仅此而已:

class Person1 extends scala.AnyRef {
<paramaccessor> private[this] val name: String = _;
<paramaccessor> private[this] val id: Int = _;
def <init>(name: String, id: Int): yuval.tests.Person1 = {
Person1.super.<init>();
()
};
<empty>
};

当您添加 val 关键字时:

class Person1 extends scala.AnyRef {
<paramaccessor> private[this] val name: String = _;
<stable> <accessor> <paramaccessor> def name: String = Person1.this.name;
<paramaccessor> private[this] val id: Int = _;
<stable> <accessor> <paramaccessor> def id: Int = Person1.this.id;
def <init>(name: String, id: Int): yuval.tests.Person1 = {
Person1.super.<init>();
()
};
<empty>
};

def 被添加到字段中,使它们在封闭类之外可见,因此在使用站点可见。

关于scala - Scala 中类参数声明的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50924745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com