scala中主要构造函数参数的可访问性

时间:2014-01-22 16:58:16

标签: scala constructor

我很难理解主构造函数的概念及其参数。到目前为止我所理解的是:如果我们将课程定义为以下

class Example(a: Int, b: Int)

Scala编译器使用上述两个参数生成类Examples的主构造函数。但是,它没有在类示例的定义中定义字段 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)

我能理解这一点。但是,如何使用 this 访问这些字段?请帮我理解这一点。

2 个答案:

答案 0 :(得分:3)

它基本上生成私有val,所以

class A(a:Int) {
    def func = a
}

class A(private[this] val a:Int) {
    def func = a
}

是等价的。如果省略该功能,这可能不完全正确。

当在构造函数体外部引用构造函数参数时(例如上面的示例func),Scala会生成private[this] val,否则不生成。{/ p>

您可以查看scala规范以获取更多详细信息,或查看this stackoverflow question

答案 1 :(得分:2)

马丁的答案很棒:

它基本上生成私有val,所以

class A(a:Int) {
  def func = a
}

class A(private[this] val a:Int) {
  def func = a
}

是等效的,您可以从班级内部访问a

但请注意,class A(a: Int)表示字段a实例私有。这意味着你不能写这样的东西:

class A(a: Int){
  def sum(other: A): Int = {
    this.a + other.a
  }
}
即使两个实例属于同一类型,也不允许

other.a。您只能使用this.a