gpt4 book ai didi

scala - 使用新属性扩展 scala 集合

转载 作者:行者123 更新时间:2023-12-04 06:20:28 25 4
gpt4 key购买 nike

如果我有一个带有附加属性的新集合,例如:

class NewColl(var name: String, var values: Vector[Int])
extends IndexedSeq[Int] with IndexedSeqLike[Int, NewColl] {...}

如何定义 canBuildFromnewBuilder (参见 here )如果:
var v1 = NewColl("foo",Vector(1,2,3))
var v2 = v1 filter(_ > 1)
var v3 = v1 map(_ + 1)

然后 v2.name=="foo"v3.name=="foo" ?

最佳答案

试试这个:

class NewColl(val name: String, val values: Vector[Int])
extends IndexedSeq[Int] with IndexedSeqLike[Int, NewColl] with SeqForwarder[Int] {
override def newBuilder: Builder[Int, NewColl] = NewColl.newBuilder(name)
protected override def underlying = values
}

object NewColl {
def apply(name: String, elems: Vector[Int]) = new NewColl(name, elems)
implicit def canBuildFrom: CanBuildFrom[NewColl, Int, NewColl] = {
new CanBuildFrom[NewColl, Int, NewColl] {
def apply(from: NewColl) = from.newBuilder
def apply() = newBuilder(defaultName)
}
}
private def newBuilder(name: String) = Vector.newBuilder[Int].mapResult(vector => new NewColl(name, vector))
private def defaultName: String = error("no default name")
}

请注意,我已更改您的 var转入 val s 在这里与不可变集合保持一致。 SeqForwarder已混入其中以避免实现将全部转发到 values 上的同一方法的方法列表. newBuilder已在伴随对象上实现,需要 String范围。

请注意,收藏有时可以免费调用 apply()CanBuildFrom不指定原始集合。在这种情况下,您要么必须提供默认名称,要么(如此处)抛出异常(仅当您不设计库并控制新集合的使用时才允许)。

另见 that question .

关于scala - 使用新属性扩展 scala 集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6640839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com