代码之家  ›  专栏  ›  技术社区  ›  joel DeyaEldeen

在Scala可变集合的视图中,懒惰是如何工作的?

  •  1
  • joel DeyaEldeen  · 技术社区  · 6 年前

    Scala编程 the docs ),它们给出了如何在不可变和可变集合上使用视图的示例。在那部分,他们说

    [ 变压器 是一种特殊类型的集合,它表示一些基本集合,但延迟地实现其所有转换器。

    他们给出了不可变集合的例子,我理解懒惰是如何在那里起作用的。但我正在为懒惰在易变集合示例中扮演的角色而挣扎:

    val arr = (0 to 9).toArray
    val subarr = arr.view.slice(3, 6)
    

    视图并不复制这些元素,它只是提供对它们的引用。

    def negate(xs: collection.mutable.Seq[Int]) = 
      for (i <- 0 until xs.length) xs(i) = - xs(i)
    
    negate(subarr)
    arr  // Array(0, 1, 2, -3, -4, -5, 6, 7, 8, 9)
    

    我明白为什么我们会得到这个答案。但是变压器有什么问题 slice 从来没有计算过,它们只是对 arr negate

    0 回复  |  直到 6 年前
        1
  •  0
  •   Gsquare    6 年前

    val a = Array(1,2,3)
    val b = a.map(_ + 5)
    val c = a.view.map(_ + 5)
    println(b(1)) //prints 7
    println(c(1)) // prints 7
    
    a(1) = 5
    
    println(b(1)) // still prints 7, since that array was computed on instantiation
    println(c(1)) // now prints 10, since elements of c are lazily evaluated each time.