我见过的一些博客Pimp my Library pattern
,而这些似乎也添加行为类工作。
但是,如果我有一个case class
,我想add data members
呢? 作为案例I类不能扩展它( 从壳体类继承已被弃用/强烈反对 )。 将这些皮条客模式让我将数据添加到一个案例类?
我见过的一些博客Pimp my Library pattern
,而这些似乎也添加行为类工作。
但是,如果我有一个case class
,我想add data members
呢? 作为案例I类不能扩展它( 从壳体类继承已被弃用/强烈反对 )。 将这些皮条客模式让我将数据添加到一个案例类?
不-我不明白你怎么能做出这样的工作,因为丰富的实例会扔掉(注:新的皮条客,我的图书馆模式被称为充实,我的库)。 例如:
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
不过,我觉得这在实践中没有用的。 你有一个包装; 你最好使这明确
这不是做的方式。 的可能性只是一个证明。 有了这样你可以得到很多的问题。
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]