在实施Scala的.clone“(Implementing '.clone' in

2019-08-01 19:44发布

我试图找出如何.clone我自己的对象,在斯卡拉。

这是一个模拟所以可变状态是必须的,并从出现的克隆全部的需要。 我会向前推进仿真时间之前克隆整个国家结构。

这是我目前的尝试:

abstract trait Cloneable[A] {
  // Seems we cannot declare the prototype of a copy constructor
  //protected def this(o: A)    // to be defined by the class itself

  def myClone= new A(this)
}

class S(var x: String) extends Cloneable[S] {
  def this(o:S)= this(o.x)    // for 'Cloneable'
  def toString= x
}

object TestX {
  val s1= new S("say, aaa")
  println( s1.myClone )
}

一个。 为什么上面没有编译。 得到:

error: class type required but A found
  def myClone= new A(this)
                   ^

湾 是否有申报拷贝构造函数的方式( def this(o:A)的特征),因此使用性状类将被证明需要提供一个。

C。 难道有说任何好处abstract trait

最后,有没有更好的方式,标准溶液这一切?

我已经研究过Java的克隆。 似乎并不为这一点。 此外斯卡拉copy不是-它只是为case类,他们不应该有可变的状态。

感谢您的帮助和任何意见。

Answer 1:

性状不能定义构造函数(我不认为abstract有一个特点任何影响)。

是否有它需要使用拷贝构造函数,而不是仅仅实现一个克隆方法的原因吗? 有可能走出不必申报[A]对类类型的,但我至少宣布自类型,这样编译器将确保该类型的类相匹配。

trait DeepCloneable[A] { self: A =>
    def deepClone: A
}

class Egg(size: Int) extends DeepCloneable[Egg] {
    def deepClone = new Egg(size)
}

object Main extends App {
    val e = new Egg(3)
    println(e)
    println(e.deepClone)
}

http://ideone.com/CS9HTW



Answer 2:

这将意味着一个类型类为基础的方法。 有了这个就可以也让现有的类可复制:

class Foo(var x: Int)

trait Copyable[A] {
  def copy(a: A): A
}

implicit object FooCloneable extends Copyable[Foo] {
  def copy(foo: Foo) = new Foo(foo.x)
}

implicit def any2Copyable[A: Copyable](a: A) = new {
  def copy = implicitly[Copyable[A]].copy(a)
}


scala> val x = new Foo(2)
x: Foo = Foo@8d86328

scala> val y = x.copy
y: Foo = Foo@245e7588

scala> x eq y
res2: Boolean = false


Answer 3:

  • 一个。 当你定义喜欢的类型参数 A它被编译阶段后删除

    这意味着,编译器使用类型的参数来检查是否使用了正确的类型,但由此产生的字节码不保留的信息A

    这也意味着,你不能用A作为代码,但只能作为“类型引用”一个真正的类,因为在运行时,这个信息会丢失。

  • B&C。 性状不能被定义定义构造函数的参数或辅助建设者,他们也被定义抽象。

    你可以做的是定义一个特征体能够顺利通过的具体实施实例称为

一种替代的解决方案是定义一个Cloneable 类型类 。 欲了解更多关于这一点,你可以找到很多关于这一主题的博客,但我有一个特定的一个没有建议。

scalaz有一个很大一部分建使用这种模式,也许你能在那里找到灵感:你可以看看订单 , 等于或展示来获得它的要点。



文章来源: Implementing '.clone' in Scala
标签: scala