scala - 使用具体类型扩展 Scala Set

标签 scala scala-2.8

真的很难弄清楚用一个代表具体类型的 Set 的类来扩展不可变的 Set 。我这样做是为了尝试创建一个不错的 DSL。

我想要一个类 Thing,当你将“事物”加在一起时,你会得到一个 ThingSet 对象,它扩展了 Set。

class Thing(val name:String){
  def +(other: Thing):ThingSet = new ThingSet() + other
}

我只是不知道如何制作 ThingSet 对象。我知道我需要混合 GenericSetTemplate、SetLike 等特征。但我无法让它发挥作用。

拜托,任何人都可以给我一些指示,因为我找不到任何足够明确的东西可以学习。我试过查看 BitSet 和 HashSet 实现,但迷路了。

最佳答案

改编自 this Daily 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
    }
}

关于scala - 使用具体类型扩展 Scala Set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4416885/

相关文章:

java - 如何从java程序的main方法调用Scala程序的main方法?

scala - Free Monads 中的抽象结果类型

scala - 将具有静态属性和注释的Java类转换为等效的Scala

scala - Scala 2.8.0 和 2.7.7 中 Map 行为的这种令人惊讶的差异(对我来说)是预期的吗?

java - 我将如何在 scala 程序中编译和执行 java 程序?

Scala 表达式求值

scala - assemblyMergeStrategy 类型错误

Scala 2.8.0 工具链

eclipse - 在Eclipse项目中混合Scala和Java文件

斯卡拉 2.8 : how to initialize child class