【发布时间】:2011-09-28 16:11:19
【问题描述】:
在编写 Scala 代码时,我经常遇到这样的情况,即我有“处理器”函数对元素集合进行迭代操作,并且还需要知道集合的长度。
另一方面,我有生成集合的“提供者”函数,因此已经知道长度。生成的集合可能是List[T]、Array[T] 或Set[T] 等,但即使在List[T] 的情况下,我的生成器也知道大小(即使List 类型不存储它)。
所以我很自然地将“处理器”函数声明为采用似乎适合所有集合类型的最通用类型Iterable[T] 作为参数。然而,他们在内部需要以 O(N) 为代价通过迭代集合遍历来找出大小,这是不可取的。
所以我的天真的解决方案是创建一个像IterableWithSize[T] 这样的新类型,并让提供者和处理器函数创建并采用这种类型。 Seq[T] 和 IndexedSeq[T] 似乎都不符合要求。但这似乎是一个相对常见的用例,所以我怀疑有一种更惯用的方法来做到这一点。那会是什么?
【问题讨论】:
-
我不明白为什么
IndexedSeq[T]不适合你…… -
由于您实际上想在集合中存储额外的数据,我认为您最好的天真方法是。
-
@Jean-Philippe Set[T] 不是 IndexedSeq[T]