为什么这个类在 Scala 2.x 中被允许,而在 Scala 3 中却抱怨
a
的重复定义?
class A private(a:Int) {
def a(): Int = this.a+1
}
Double definition:
private[this] val a: Int in class A at line 1 and
def a(): Int in class A at line 2
这是设计使然还是 Scala 3 中的一个错误?
class A private(a: Int) {
def a(): Int = this.a + 1
}
TL;DR:在 Scala 2 中,这会创建
A
的成员和方法,它们都称为 a
,但 Scala 3 不允许重复使用相同的名称。
在 Scala 2 中,有一个成员
a
,其中包含传递给构造函数的值,以及一个返回 a
的方法 this.a + 1
。这可以通过添加第二种方法来显示b
:
class A(a: Int) {
def a(): Int = a + 1
def b(): Int = a() + 1
}
println(new A(3).a()) // 4
println(new A(3).a) // 4 with compiler warning about auto-application
println(new A(3).b()) // 5
在类中,您会获得不同的
a
值,具体取决于它是裸露使用还是作为函数调用。方法 a
使用成员值 a
,而方法 b
使用方法值 a
。在类之外只有方法是可见的。
请注意,这具体是
val
的非 var
非 class
构造函数参数的行为问题。如果构造函数参数设置为 val
或 var
,即使在 Scala 2 中,编译器也会将其标记为重复。