我试图了解Scala案例类与普通类的区别。
E.g。我有一个定义
case class Charge(cc: CreditCard, amount: Double)
可以像carge.cc
和charge.amount
一样使用它。
是否使用了这些语句常量字段引用或实际隐藏的getter?是否有可能重新定义例如语义。 carge.cc
在返回值之前添加一些代码?
答案 0 :(得分:1)
案例类是"产品类型"。把它想象成元组,用元素命名,而不是索引。从技术上讲,是的,cc
是一个生成的访问函数,但不能重新定义它。如果可以的话,它将打破它作为案例类开始的目的。
只需做这样的事情:
class Charge(_cc: CreditCard, _amount: Double) {
def cc = modify(_cc)
def amount = addTips(_amount)
}
答案 1 :(得分:0)
使用代码内容创建文件Charge.scala
然后使用scalac -print Charge.scala
编译代码,您将获得:
[syntax trees at end of cleanup]] // Test.scala
package <empty> {
case class Charge extends Object with Product with Serializable {
<caseaccessor> <paramaccessor> private[this] val cc: Int = _;
<stable> <caseaccessor> <accessor> <paramaccessor> def cc(): Int = Charge.this.cc;
<caseaccessor> <paramaccessor> private[this] val amount: Double = _;
<stable> <caseaccessor> <accessor> <paramaccessor> def amount(): Double = Charge.this.amount;
<synthetic> def copy(cc: Int, amount: Double): Charge = new Charge(cc, amount);
<synthetic> def copy$default$1(): Int = Charge.this.cc();
<synthetic> def copy$default$2(): Double = Charge.this.amount();
override <synthetic> def productPrefix(): String = "Charge";
<synthetic> def productArity(): Int = 2;
<synthetic> def productElement(x$1: Int): Object = {
case <synthetic> val x1: Int = x$1;
(x1: Int) match {
case 0 => scala.Int.box(Charge.this.cc())
case 1 => scala.Double.box(Charge.this.amount())
case _ => throw new IndexOutOfBoundsException(scala.Int.box(x$1).toString())
}
};
override <synthetic> def productIterator(): Iterator = runtime.this.ScalaRunTime.typedProductIterator(Charge.this);
<synthetic> def canEqual(x$1: Object): Boolean = x$1.$isInstanceOf[Charge]();
override <synthetic> def hashCode(): Int = {
<synthetic> var acc: Int = -889275714;
acc = Statics.this.mix(acc, Charge.this.cc());
acc = Statics.this.mix(acc, Statics.this.doubleHash(Charge.this.amount()));
Statics.this.finalizeHash(acc, 2)
};
override <synthetic> def toString(): String = ScalaRunTime.this._toString(Charge.this);
override <synthetic> def equals(x$1: Object): Boolean = Charge.this.eq(x$1).||({
case <synthetic> val x1: Object = x$1;
case5(){
if (x1.$isInstanceOf[Charge]())
matchEnd4(true)
else
case6()
};
case6(){
matchEnd4(false)
};
matchEnd4(x: Boolean){
x
}
}.&&({
<synthetic> val Charge$1: Charge = x$1.$asInstanceOf[Charge]();
Charge.this.cc().==(Charge$1.cc()).&&(Charge.this.amount().==(Charge$1.amount())).&&(Charge$1.canEqual(Charge.this))
}));
def <init>(cc: Int, amount: Double): Charge = {
Charge.this.cc = cc;
Charge.this.amount = amount;
Charge.super.<init>();
scala.Product$class./*Product$class*/$init$(Charge.this);
()
}
};
<synthetic> object Charge extends scala.runtime.AbstractFunction2 with Serializable {
final override <synthetic> def toString(): String = "Charge";
case <synthetic> def apply(cc: Int, amount: Double): Charge = new Charge(cc, amount);
case <synthetic> def unapply(x$0: Charge): Option = if (x$0.==(null))
scala.this.None
else
new Some(new Tuple2$mcID$sp(x$0.cc(), x$0.amount()));
<synthetic> private def readResolve(): Object = Charge;
case <synthetic> <bridge> <artifact> def apply(v1: Object, v2: Object): Object = Charge.this.apply(scala.Int.unbox(v1), scala.Double.unbox(v2));
def <init>(): Charge.type = {
Charge.super.<init>();
()
}
}
}
告诉您this.cc
是通过名为cc()
的方法从对象的实际属性提供的。