[英]Scala Constructor Confusion - please clarify
我对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上的这个人说“构造函数的输入参数不是 val, 除非你说它们是。” 这是一个矛盾。
另外,由于某种原因,我显然可能需要也可能不需要在构造函数中添加“val”和“override”? 我的意思是我希望一切都是公共的和不可变的,并且Add的符号等于“+”,binaryOp等于加法函数,还有两个数字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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.