添加一个字段,斯卡拉案例类?(Adding a field to Scala case class?

2019-09-18 03:31发布

我见过的一些博客Pimp my Library pattern ,而这些似乎也添加行为类工作。

但是,如果我有一个case class ,我想add data members呢? 作为案例I类不能扩展它( 从壳体类继承已被弃用/强烈反对 )。 将这些皮条客模式让我将数据添加到一个案例类?

Answer 1:

不-我不明白你怎么能做出这样的工作,因为丰富的实例会扔掉(注:新的皮条客,我的图书馆模式被称为充实,我的库)。 例如:

scala> case class X(i: Int, s: String)
defined class X

scala> implicit class Y(x: X)  {
   |     var f: Float = 0F
   |   }
defined class Y

scala> X(1, "a")
res17: X = X(1,a)

scala> res17.f = 5F
res17.f: Float = 0.0

scala> res17.f
res18: Float = 0.0

你必须确保你保持包装的实例的保持:

scala> res17: Y
res19: Y = Y@4c2d27de

scala> res19.f = 4
res19.f: Float = 4.0

scala> res19.f
res20: Float = 4.0

不过,我觉得这在实践中没有用的。 你有一个包装; 你最好使这明确



Answer 2:

这不是做的方式。 的可能性只是一个证明。 有了这样你可以得到很多的问题。

scala> :paste
// Entering paste mode (ctrl-D to finish)

case class A(i: Int)

class B(a: A){
  var s: String = ""
}

object B{
  val as = scala.collection.mutable.WeakHashMap[A, B]()
}

implicit def a2b(a: A) = B.as.getOrElseUpdate(a, new B(a))

// Exiting paste mode, now interpreting.

defined class A
defined class B
defined module B
a2b: (a: A)B

scala> val a = A(1)
a: A = A(1)

scala> a.s = "test"

scala> a.s
res0: String = test

WeakHashMap中 :参考文献的哈希映射到它们是弱可及的条目。 (强)引用条目从该地图移除时,关键是不再。 该类包装java.util.WeakHashMap中。

需要注意的是,由于case class的重载equals方法你得到这个有趣的现象:

scala> A(2).s = "test2"

scala> A(2).s
res2: String = test2

所以你不应该使用case class或用它override def equals(that: Any) = this eq that.asInstanceOf[AnyRef]



文章来源: Adding a field to Scala case class?
标签: class scala case