【问题标题】:Why is Buffer not a subclass of IndexedSeq?为什么 Buffer 不是 IndexedSeq 的子类?
【发布时间】:2013-02-15 01:36:59
【问题描述】:

在 scala 集合库中,Buffer 继承自 Seq

Buffer[A] extends Seq[A] with GenericTraversableTemplate[A, Buffer] with BufferLike[A, Buffer[A]] with scala.Cloneable

Buffer 文档说:

缓冲区用于以增量方式创建元素序列 追加、前置或插入新元素。也是可以的 通过索引以随机访问方式访问和修改元素 当前序列中的元素。

IndexedSeq 文档说:

索引序列的基本特征。

索引序列支持恒定时间或接近恒定时间的元素 访问和长度计算。它们是根据抽象定义的 方法适用于索引和长度。

索引序列不会向 Seq 添加任何新方法,但承诺 随机访问模式的有效实现。

由于Buffer 已经扩展Seq 并且IndexedSeq 不会向Seq 添加任何方法 缓冲区必须已经实现IndexedSeq 接口并根据文档 应满足IndexedSeq的非功能性要求。 那么为什么Buffer 不是IndexedSeq

【问题讨论】:

    标签: scala scala-collections


    【解决方案1】:

    Buffer 不是IndexedSeq,因为它不能保证接近恒定时间的元素访问和长度计算。例如,ListBuffer 两者都不支持,正如您在此 description of the performance characteristics of Scala collections 中看到的那样。

    【讨论】:

    • 好的,但是documentation for Buffer也可以以随机访问方式访问和修改元素,这似乎具有误导性。我最初在脑海中将 Buffer 和 ArrayBuffer 混为一谈
    • @DanielMahler 也可以在所有Buffer上随机访问和修改,但不一定有效。 IndexedSeq 提供效率保证。
    • 我的理解是 random access 意味着有效的索引访问,即我不认为链表是随机访问。否则,您也可以随机访问顺序文件。 FWIW Wikipedia 似乎也接受了这个阅读。我得到了你的答案;我只是认为应该更改Buffer 上的文档。
    猜你喜欢
    • 1970-01-01
    • 2022-08-03
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多