代码之家  ›  专栏  ›  技术社区  ›  Ken Kiarie

捕获局部变量

  •  0
  • Ken Kiarie  · 技术社区  · 1 年前

    在学习兰姆达斯时,我遇到了这个 “…局部变量的生存期受声明变量的函数的约束。但如果它被lambda捕获,则使用此变量的代码可以在以后存储和执行。” 本文没有提供此过程的代码示例。是否有一个代码示例可以实现所声称的功能?

    1 回复  |  直到 1 年前
        1
  •  4
  •   Sweeper    1 年前

    通常,一旦声明局部变量的函数返回,局部变量就不复存在。

    fun someFunction() {
        var x = 0
        // "x" ceases to exist after someFunction returns
    }
    

    让我们抓住 x 转化为lambda:

    fun someFunction(): () -> Unit {
        var x = 0
        // here "x" is captured
        val someLambda = { println(x++) }
        x = 10
        return someLambda
    }
    

    x 的生命周期已延长到与lambda一样长。为了证明这一点,我做了 someFunction 返回lambda,以便即使在以下情况下也可以使用它 some函数 返回。让我们在中多次调用lambda main .

    fun main() {
        val f = someFunction()
        f() // prints 10
        f() // prints 11
        f() // prints 12
    }
    

    显然, f 仍在打印的值 x 并对其进行递增,即使在 some函数 已经回来了。这表明 x 之后仍然存在 some函数 已经回来了。

    这个想法是,一旦在lambda中捕获了一个变量,就可以将该lambda传递给其他对象,并且可以在声明该变量的原始函数返回后很长时间内调用它。变量的生存期 必须 被延长,否则谁知道当这些羔羊被召唤时会发生什么?