私は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)
}
}
私は(val)でどのようなScalaのコンストラクタに行くすると、自動的に不変であることを一つのサイトで読んでますが、スタックオーバーフロー上のこの男は"The input parameters for the constructor are not vals unless you say they are."は、だから、1つの矛盾だと述べました。
また、私は明らかに何らかの理由でコンストラクタに "val"と "override"を追加する必要はないかもしれませんか?つまり、すべてを公開して不変にし、Addに "+"と等しいシンボル、加算関数に等しいbinaryOp、さらに2つの数値aとbを持たせたいと思う。誰かが、冗長ではない方法でコンストラクタを期待通りに動作させる方法を説明してください。
私はこのような何かを行うことができるようにしたい:
addition = Add(Number(1), Number(2))
addition.binaryOp(addition.a.value, addition.b.value)
REPLは、クラスパラメータvalを呼び出します。 'クラスC(x:Int){def mod(y:Int):Unit = x = y}'はエラーを返します:valへの再割り当て。 – jwvh