我很难理解主要构造函数及其参数的概念。到目前为止,我所了解的是:如果我们将以下类定义为
class Example(a: Int, b: Int)
Scala编译器使用上述两个参数生成示例类的主要构造函数。但是,它没有在类Example的定义中定义字段a和b。但是如果我们定义
class Example(val a: Int, val b: Int)
scala编译器如上所述生成主构造函数,并在类定义中添加两个字段。
现在问题来了,当我尝试一个例子
class PrimaryConstructor(a: Int, b: Int){
override def toString() = "PrimaryConstructor(" + this.a + ", " + this.b + ")"
}
即使没有名为a或b的字段,上述代码也可以很好地编译。我无法理解,如果没有这样的字段,那么我如何使用this:当前对象引用来访问它们。
object Main{
def main(args: Array[String]){
val primaryConstructor = new PrimaryConstructor(1, 2)
println(primaryConstructor.a)
}
}
虽然如果我尝试从上述类定义的外部访问它们,则在编译后会收到以下错误消息。
error: value a is not a member of PrimaryConstructor
println(primaryConstructor.a)
我能理解 但是,如何使用此方法访问这些字段?请帮助我理解这一点。
它基本上会生成一个私有val,所以
class A(a:Int) {
def func = a
}
和
class A(private[this] val a:Int) {
def func = a
}
是等效的。如果您省略此功能,可能并不完全正确。
当在构造函数主体外部引用构造函数参数时(例如func
上述示例),Scala会生成一个private[this] val
,否则不会生成。
您可以检查scala规范以了解更多详细信息,或查看此stackoverflow问题
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句