4

我有一个延迟计算的对象序列,其中延迟计算仅取决于索引(而不是前面的项目)和一些常量参数(p:Bar如下)。我目前正在使用Stream,但是计算stream.init通常是浪费的。

但是,我真的很喜欢 usingStream[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)
}

是否有一个可比较的StreamScala 基类,它是索引的而不是线性的?

4

1 回答 1

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使用比您要求的更高的索引进行计算。

于 2013-04-25T17:37:19.623 回答