Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scala中主构造函数参数的可访问性_Scala_Constructor - Fatal编程技术网

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

scala中主构造函数参数的可访问性,scala,constructor,Scala,Constructor,我很难理解主构造函数的概念及其参数。到目前为止我所理解的是:如果我们定义一个类如下 class Example(a: Int, b: Int) Scala编译器使用上述两个参数生成类示例的主构造函数。但是,它没有在类示例的定义中定义字段a和b。但如果我们定义 class Example(val a: Int, val b: Int) scala编译器如上所述生成主构造函数,并在类定义中添加两个字段 现在问题来了,当我尝试这样一个例子时 class PrimaryConstructor(a:

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

class Example(a: Int, b: Int)
Scala编译器使用上述两个参数生成类示例的主构造函数。但是,它没有在类示例的定义中定义字段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的字段,上述代码也能很好地编译。我无法理解,如果没有任何字段,那么我如何使用当前对象引用来访问它们

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(a:Int) {
  def func = a
}

它们是等价的。如果省略该函数,这可能不完全正确

当构造函数参数引用到构造函数主体之外时(例如上面的示例
func
),Scala会生成一个
private[this]val
,否则不会


您可以查看scala规范以了解更多详细信息,也可以查看马丁的答案:


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

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

是等效的,您可以从类内访问
a

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

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

其他。即使两个实例的类型相同,也不允许使用
。您只能使用
this.a

如果您有一些Javascript经验,请尝试放弃类的Java概念,而将类视为主构造函数中参数的闭包(函数)。“一切都是一个闭包”的概念是scala的一个核心概念,一旦你尝试了它,它就会非常强大。主构造函数确保类将行为关联到的状态只有一个规范表示。非常感谢。我试着用“javap-p PrimaryConstructor”反汇编以查看私有字段,这显示了所有字段。