真的很难找出用一个代表一组具体类型的类扩展不可变集合.我这样做是为了尝试创建一个不错的DSL.
我想要一个类Thing,当你将'things'加在一起时,你得到一个ThingSet对象,它扩展了Set.
class Thing(val name:String){
def +(other: Thing):ThingSet = new ThingSet() + other
}
Run Code Online (Sandbox Code Playgroud)
我只是无法弄清楚如何制作ThingSet对象.我知道我需要混合GenericSetTemplate,SetLike等特性.但我无法使它工作.
请问,任何人都可以给我一些指示,因为我找不到任何明确的东西可以借鉴.我试过看BitSet和HashSet实现,但迷路了.
改编自这个每日Scala帖子以及源码BitSet,这是一个很好的例子,因为它不是参数化集合,而且相当简短.
import scala.collection.SetLike
import scala.collection.generic.{GenericSetTemplate, GenericCompanion, CanBuildFrom}
import scala.collection.mutable.{Builder, SetBuilder}
class ThingSet(seq : Thing*) extends Set[Thing]
with SetLike[Thing, ThingSet]
with Serializable {
override def empty: ThingSet = new ThingSet()
def + (elem: Thing) : ThingSet = if (seq contains elem) this
else new ThingSet(elem +: seq: _*)
def - (elem: Thing) : ThingSet = if (!(seq contains elem)) this
else new ThingSet(seq filterNot (elem ==): _*)
def contains (elem: Thing) : Boolean = seq exists (elem ==)
def iterator : Iterator[Thing] = seq.iterator
}
object ThingSet {
def empty: ThingSet = new ThingSet()
def newBuilder: Builder[Thing, ThingSet] = new SetBuilder[Thing, ThingSet](empty)
def apply(elems: Thing*): ThingSet = (empty /: elems) (_ + _)
def thingSetCanBuildFrom = new CanBuildFrom[ThingSet, Thing, ThingSet] {
def apply(from: ThingSet) = newBuilder
def apply() = newBuilder
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2030 次 |
| 最近记录: |