Scala prevent mixing methods

I would like to create the following characteristic:

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 

returns

 (2, 3, 4, 5, 10, 15, 20, 25, 12, 18, 24, 30, 14, 21, 28, 35) 

But I do not want the toString method from the case class to be overridden by one of the passed ones! How can I overcome this?

I want the end result to be:

 "AProduct(List(1, 5,6,7), List(2,3,4,5))" 

and, if possible, I would like to do something else than the following in IntSet:

 override def toString = this.getClass().getName()+"("+self.productIterator.mkString(",")+")" 

which works, but I really would like not to reinvent the wheel.

+2
tostring override scala traversable
source share
1 answer

You do not need to implement IntSet in AProduct . You can simply add all methods without inheritance as follows:

 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 <- pa; bb <- pb) 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 
+5
source share

All Articles