我有一个懒惰计算的对象序列,其中惰性计算仅取决于索引(不是前面的项)和一些常量参数(下面的p:Bar
)。我目前正在使用Stream,但计算stream.init
通常很浪费。
但是,我真的很喜欢使用Stream[Foo] = ...
使我无法实现缓存,并且具有非常轻的声明语法,同时仍提供所有糖(如stream(n)
获取元素n
) 。然后,我可能只是使用了错误的声明:
class FooSrcCache(p:Bar) {
val src : Stream[FooSrc] = {
def error() : FooSrc = FooSrc(0,p)
def loop(i: Int): Stream[FooSrc] = {
FooSrc(i,p) #:: loop(i + 1)
}
error() #:: loop(1)
}
def apply(max: Int) = src(max)
}
是否有Stream
- 可比较的基础Scala类,它是索引而不是线性的吗?
答案 0 :(得分:3)
PagedSeq
应该为你完成这项工作:
class FooSrcCache(p:Bar) {
private def fill(buf: Array[FooSrc], start: Int, end: Int) = {
for (i <- start until end) {
buf(i) = FooSrc(i,p)
}
end - start
}
val src = new PagedSeq[FooSrc](fill _)
def apply(max: Int) = src(max)
}
请注意,这可能会使用高于您请求的索引来计算FooSrc
。