Переопределить toString в наборе Scala

Я хочу создать набор целых чисел с именем IntSet, IntSet идентично Set[Int] во всех отношениях, кроме того, что его toString функция печатает элементы как разделенные запятыми (так же, как если бы вы вызвали mkString(",")), и у него есть конструктор, который принимает Traversable целых чисел. Какой самый простой способ сделать это?

> IntSet((1 to 3)).toString
1,2,3

Я думаю, что есть какой-то однострочный способ сделать это, но я возился с неявными функциями и расширял HashSet и я не могу понять это.


Хитрость заключается в использовании прокси-объекта. Eastsun есть ответ ниже. Вот немного другая версия, которая определяет именованный IntSet типа и делает его неизменным.

import collection.immutable.{HashSet, SetProxy}

class IntSet(values: Traversable[Int]) extends SetProxy[Int] {
  override val self: Set[Int] = HashSet(values.toSeq:_*)
  override def toString() = mkString(",")
}

1 ответ

Решение
scala> import scala.collection.mutable
import scala.collection.mutable

scala> def IntSet(c: Traversable[Int]): mutable.Set[Int] = new mutable.SetProxy[Int] {
     |   override val self: mutable.Set[Int] = mutable.HashSet(c.toSeq :_*)
     |   override def toString = mkString(",")
     | }
IntSet: (c: Traversable[Int])scala.collection.mutable.Set[Int]

scala> IntSet(1 to 3)
res0: scala.collection.mutable.Set[Int] = 1,2,3
Другие вопросы по тегам