在Scala中,主构造函数参数的可访问性。

16 浏览
0 Comments

在Scala中,主构造函数参数的可访问性。

我很难理解主构造函数及其参数的概念。到目前为止,我已经理解的是:如果我们将一个类定义如下:

class Example(a: Int, b: Int)

Scala编译器会为类Example生成一个带有以上两个参数的主构造函数。但是,它并没有在类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)

我可以理解这一点。但是,我如何使用this访问这些字段呢?请帮助我理解这个问题。

0
0 Comments

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

在Scala中,当我们定义一个类时,可以在主构造函数中声明参数。然后我们可以在类的其他方法中使用这些参数。然而,有时候我们可能希望限制对这些参数的访问,只能在类的内部使用。

下面是一个示例,展示了如何在Scala中定义一个类,并在类的方法中使用主构造函数参数:

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

在上面的示例中,我们定义了一个类A,并在主构造函数中声明了一个参数a。然后我们定义了一个方法func,该方法返回参数a的值。在方法func中,我们可以直接使用参数a,因为它是在类的作用域内定义的。

然而,需要注意的是,当参数a被定义为实例私有时,即使用private[this]修饰时,只能在类的内部使用,无法在类的其他实例中使用。下面是一个示例:

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

在上面的示例中,我们使用private[this]修饰符将参数a定义为实例私有。然后我们定义了一个方法func,该方法返回参数a的值。在方法func中,我们仍然可以直接使用参数a,因为它是在类的作用域内定义的。

然而,需要注意的是,当参数a被定义为实例私有时,无法在类的其他实例中访问它。下面是一个示例:

class A(a: Int) {
  def sum(other: A): Int = {
    this.a + other.a
  }
}

在上面的示例中,我们定义了一个方法sum,它接受一个类型为A的参数other,并返回参数a的值与other.a的和。然而,由于参数a是实例私有的,因此无法在方法sum中访问参数other的a。只能使用this关键字来访问当前实例的a。

当我们在Scala中定义类的主构造函数参数时,需要注意参数的可访问性。如果希望参数在类的内部和外部都可访问,可以直接在主构造函数中声明参数。如果希望参数只能在类的内部使用,可以使用private[this]修饰符将参数定义为实例私有。

0
0 Comments

Scala的主构造函数参数的可访问性问题

在Scala中,如果在构造函数体外部引用了构造函数的参数,Scala会自动生成一个private[this] val,否则不会生成。这意味着主构造函数的参数默认是私有的。

下面是一个示例:

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

上述代码中,构造函数参数a在构造函数体外部被引用,因此Scala会自动生成一个私有的private[this] val。这意味着在类A的方法func中可以直接访问参数a。

同样地,下面的代码与上述代码等价:

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

在这个例子中,我们明确地将构造函数的参数a标记为私有的private[this],这样也可以在类A的方法func中直接访问参数a。

但是,如果省略了方法func,上述等价关系可能不再成立。

如果你想了解更多细节,可以查看Scala规范,或者参考这个stackoverflow问题

感谢!我尝试使用'javap -p PrimaryConstructor'反编译来查看私有字段,结果显示出了所有私有字段。

0