Ken Kiarie Asked: 2025-01-06 13:52:03 +0800 CST2025-01-06 13:52:03 +0800 CST 2025-01-06 13:52:03 +0800 CST 捕获局部变量 772 在学习 lambda 时,我遇到了这个问题 “...局部变量的生命周期受到声明该变量的函数的限制。但如果它被 lambda 捕获,则使用此变量的代码可以存储并在以后执行。” 文本没有提供此过程的代码示例。是否有代码示例可以实现所声称的功能? kotlin 1 个回答 Voted Best Answer Sweeper 2025-01-06T15:39:46+08:002025-01-06T15:39:46+08:00 通常,一旦声明它们的函数返回,局部变量就不复存在。 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,这样即使在返回后也可以使用它someFunction。让我们在 中调用 lambda 几次main。 fun main() { val f = someFunction() f() // prints 10 f() // prints 11 f() // prints 12 } 显然,即使在返回后,f仍在打印x并增加的值someFunction。这表明在返回x后仍然存在。someFunction 这个想法是,一旦变量被 lambda 捕获,该 lambda 就可以传递给其他东西,并且可以在声明该变量的原始函数返回后很长时间调用它。必须延长变量的生命周期,否则谁知道在调用这些 lambda 时会发生什么?
通常,一旦声明它们的函数返回,局部变量就不复存在。
让我们将其捕获
x
到 lambda 中:x
的生命周期已延长到与 lambda 一样长。为了说明这一点,我someFunction
返回了 lambda,这样即使在返回后也可以使用它someFunction
。让我们在 中调用 lambda 几次main
。显然,即使在返回后,
f
仍在打印x
并增加的值someFunction
。这表明在返回x
后仍然存在。someFunction
这个想法是,一旦变量被 lambda 捕获,该 lambda 就可以传递给其他东西,并且可以在声明该变量的原始函数返回后很长时间调用它。必须延长变量的生命周期,否则谁知道在调用这些 lambda 时会发生什么?