在Scala 2.10.2中,我试图通过滚动我自己的一些简单集合来了解有关集合层次结构的更多信息。
以下是表示整数序列的玩具类的源代码。
import scala.collection.SeqLike
import scala.collection.mutable.Builder
import scala.collection.generic.CanBuildFrom
object IntSeq
{
def apply( ints : Int* ) : IntSeq = new IntSeq( ints )
protected def newBuilder( iterable : Iterable[Int] ) : Builder[Int,IntSeq] = new Builder[Int,IntSeq]
{
var init = scala.collection.mutable.ArrayBuffer( iterable.toSeq:_* )
def +=( elem : Int ) : this.type = { init += elem; this }
def result() : IntSeq = new IntSeq( init )
def clear() : Unit = init = scala.collection.mutable.ArrayBuffer[Int]()
}
implicit def canBuildFrom : CanBuildFrom[Iterable[Int],Int,IntSeq] = new CanBuildFrom[Iterable[Int],Int,IntSeq]
{
def apply() : Builder[Int,IntSeq]= newBuilder( Seq() )
def apply( from : Iterable[Int] ) : Builder[Int,IntSeq] = newBuilder( from )
}
}
class IntSeq( seq : Seq[Int] )
extends Seq[Int]
with SeqLike[Int,Seq[Int]]
{
def sumSquared() = seq.map( i => i * i ).sum
// SeqLike interface
def iterator : Iterator[Int] = seq.iterator
def apply( idx : Int ) : Int = seq( idx )
def length : Int = seq.length
}
我遇到的问题如下:在summary section of the page "The Architecture of Scala Collections"中,第4点说通过在随播对象中提供隐式canBuildFrom
,map
和类似函数将返回此实例类。但是,这不会发生:
scala> IntSeq( ( 1 to 10 ):_* ).filter( _ % 2 == 0 )
res0: Seq[Int] = List(2, 4, 6, 8, 10)
有人可以解释为什么会这样吗?
答案 0 :(得分:4)
看看过滤器方法返回的内容。 它从TraversableLike返回Repr类型。 这与SeqLike中的第二个类型参数的类型相同。 在你的情况下它是Seq [Int]。一切都按预期工作。 如果你想把类型作为IntSeq:
class IntSeq( seq : Seq[Int] )
extends Seq[Int]
with SeqLike[Int,IntSeq]
答案 1 :(得分:0)
filter
上的 SeqLike[A, Repr]
会返回Repr
类型的值。但是,您使您的课程延长SeqLike[Int, Seq[Int]]
。如果您希望类上的操作返回IntSeq
类型的值,则应扩展SeqLike[Int, IntSeq]
。