Scala防止混合方法

Mik*_*yer 2 overriding scala tostring traversable

我想创建以下特征:

trait IntSet[A] extends Traversable[A] { self: Product =>
  def foreach[U](f: A => U): Unit
}

case class AProduct(a: List[Int], b: List[Int]) extends IntSet[Int] {
  def foreach[U](f: Int => U): Unit = {
    for(aa <- a; bb <- b) f(aa*bb)
  }
}

 AProduct(List(1, 5,6,7), List(2,3,4,5)).toString
Run Code Online (Sandbox Code Playgroud)

回报

(2, 3, 4, 5, 10, 15, 20, 25, 12, 18, 24, 30, 14, 21, 28, 35)
Run Code Online (Sandbox Code Playgroud)

但我不希望case类中的toString方法被遍历的一个覆盖!我该如何克服这个问题?

我希望最终输出为:

"AProduct(List(1, 5,6,7), List(2,3,4,5))"
Run Code Online (Sandbox Code Playgroud)

如果可能的话,我想在IntSet中做以下的事情:

override def toString = this.getClass().getName()+"("+self.productIterator.mkString(",")+")"
Run Code Online (Sandbox Code Playgroud)

哪个有效,但我真的不想重新发明轮子.

sen*_*nia 5

你并不需要实现IntSetAProduct.你可以添加所有没有继承的方法,如下所示:

case class AProduct(a: List[Int], b: List[Int])
object AProduct {
  implicit class AProductIntSet(p: AProduct) extends Traversable[Int] {
    def foreach[U](f: Int => U): Unit = {
      for(aa <- p.a; bb <- p.b) f(aa*bb)
    }
  }
}

val ap = AProduct(List(1, 5,6,7), List(2,3,4,5))
// AProduct = AProduct(List(1, 5, 6, 7),List(2, 3, 4, 5))

ap.toString
// String = AProduct(List(1, 5, 6, 7),List(2, 3, 4, 5))

ap.map{_ + 1}
// Traversable[Int] = List(3, 4, 5, 6, 11, 16, 21, 26, 13, 19, 25, 31, 15, 22, 29, 36)

for{i <- AProduct(List(2), List(3, 5))} println(i)
// 6
// 10
Run Code Online (Sandbox Code Playgroud)