【发布时间】:2011-04-30 06:38:59
【问题描述】:
我正在尝试定义一个类,它将作为一个字段作为一个集合,并希望能够直接从容器类操作这个集合:
case class MyClass(prop: String) extends TraversableLike[Int,MyClass] {
private def mySet: Set[Int]() = Set()
override def foreach[U](f: Int => U) = data.foreach[U](f)
override def newBuilder: Builder[Int, MyClass] =
new ArrayBuffer[Int] mapResult (a => MyClass(prop, a.toSet))
implicit def canBuildFrom: CanBuildFrom[MyClass, Int, MyClass] =
new CanBuildFrom[MyClass, Int, MyClass] {
def apply(): Builder[Int, MyClass] = newBuilder
def apply(from: MyClass): Builder[Int, MyClass] = newBuilder
}
}
我希望能够做到
var obj = MyClass("hello")
obj += 1
obj = obj map (_+1)
第一条指令 (obj+= 1) 有效,但第二条无效。 问题是我无法将隐式 canBuildFrom 放入对象 MyClass 中,因为构建器需要依赖于实例的信息(在本例中为 prop 字段)。
是否有解决方案使我的隐式可访问并保持其实例依赖性? 我想避免让我的班级变得可变。
【问题讨论】: