2

我想创建一组名为IntSet. 除了它的函数将元素打印为逗号分隔(与您调用 相同)之外,它在所有方面都IntSet相同,并且它有一个接受整数的构造函数。最简单的方法是什么?Set[Int]toStringmkString(",")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(",")
}
4

1 回答 1

8
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
于 2013-03-09T05:35:02.580 回答