Scala构造函数混淆 - 请澄清

时间:2015-10-20 05:31:36

标签: java scala constructor

我对Scala Constructors非常困惑。例如,我有以下类,它们表示一个树,其中运算符如树上的Add和叶节点是数字。

abstract class Node(symbol: String) {}

abstract class Operator(symbol: String,
      binaryOp: (Double, Double) => Double ) extends Node(symbol) {
}

class Add(a: Number, b: Number) extends 
      Operator("+", (a: Double, b: Double) => a+b ) {
}

class Number(symbol: String) extends Node(symbol) {
    val value = symbol.toDouble
    def this(num: Double) {
      this(num.toString)
    }
}

我在一个网站上读到,Scala构造函数中的内容是自动不可变的(val),但Stack Overflow上的这个人说"The input parameters for the constructor are not vals unless you say they are."这就是一个矛盾。

另外,我显然可能需要也可能不需要添加" val"和"覆盖"因某种原因进入构造函数?我的意思是我希望所有内容都是公共的和不可变的,并且Add的符号等于" +&#34 ;, binaryOp等于加法函数,还有两个数字a和b。有人可以解释一下如何让构造函数以非冗长的方式在Scala中按预期工作吗?

我希望能够做到这样的事情:

addition = Add(Number(1), Number(2))
addition.binaryOp(addition.a.value, addition.b.value)

1 个答案:

答案 0 :(得分:6)

你几乎就在那里:除非类的方法使用它,否则在构造类之后抛弃Scala类的构造函数的每个参数。在这种情况下,它是private[this] val

但是,您只需在构造函数参数前添加val / var关键字,它就会公开val / var

abstract class Node(val symbol: String) {}

通常,如果字段已在超类中定义,则子类的构造函数中不会重复此操作:

abstract class Operator(symbol: String, // no val here, only pass to super class
      val binaryOp: (Double, Double) => Double) extends Node(symbol) {
}

class Add(val a: Number, val b: Number) extends 
  Operator("+", (a: Double, b: Double) => a+b ) {
}

现在您可以访问课外的字段:

addition = Add(Number(1), Number(2))
addition.binaryOp(addition.a.value, addition.b.value)
相关问题