Переопределить 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