【发布时间】:2015-10-20 05:31:35
【问题描述】:
我对 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 上的这个人说 "The input parameters for the constructor are not vals unless you say they are." 所以这是一个矛盾。
另外,出于某种原因,我显然可能需要也可能不需要在构造函数中添加“val”和“override”?我的意思是我希望一切都是公开的和不可变的,并且 Add 有一个等于“+”的符号,一个 binaryOp 等于加法函数,还有两个数字 a 和 b。有人可以解释一下如何让构造函数在 Scala 中以一种非冗长的方式按预期工作吗?
我希望能够做这样的事情:
addition = Add(Number(1), Number(2))
addition.binaryOp(addition.a.value, addition.b.value)
【问题讨论】:
-
REPL 调用类参数 vals。
class C(x: Int){ def mod(y:Int):Unit = x=y }产生error: reassignment to val。
标签: java scala constructor