我对 Scala 构造函数感到非常困惑。例如,我有以下类,它们表示一棵树,其中包含诸如 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 上的这个人说“构造函数的输入参数不是 val,除非你说它们是。” https://stackoverflow.com/questions/6223959/must-override-val-variable-in-scala所以这是一个矛盾。
另外,出于某种原因,我显然可能需要也可能不需要将“val”和“override”添加到构造函数中?我的意思是,我希望所有内容都是公开且不可变的,并且 Add 有一个等于“+”的符号、一个等于加法函数的二元运算,以及两个数字 a 和 b。有人可以解释一下如何让构造函数以一种非详细的方式在 Scala 中按预期工作吗?
我希望能够做这样的事情:
addition = Add(Number(1), Number(2))
addition.binaryOp(addition.a.value, addition.b.value)
您已经差不多完成了: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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)