代码之家  ›  专栏  ›  技术社区  ›  Adrian

变量捕获:变量在函数闭包中的行为

  •  0
  • Adrian  · 技术社区  · 1 年前

    我有这个代码,我想知道变量的值 x 在定义时被函数捕获,或者如果函数捕获了对变量本身的引用(或者是否有其他内容)?

    如果 x val ?

    // Kotlin
    var x = 1
    fun f(y: Int) = x + y // Function adds 1 to a given Int
    
    x = 2
    val y = 3
    val z = f(x + y) // Calls f with argument of 5
    // z now maps to 7
    
    // Swift
    var x = 1
    func f(_ y: Int) -> Int {return x + y} // Function adds 1 to a given Int
    
    x = 2
    let y = 3
    let z = f(x + y) // Calls f with argument of 5
    // z now maps to 7
    

    所以每当我们调用函数时 f ,我们要评估它的身体 { x + y } 在环境中定义了函数。当我们定义这个函数时,我们有一个环境 x == 1 .

    所以函数 f 无论在何处调用,都会在其参数中添加1。这就是规则。(此规则适用于 let / val var 我想?)

    我的问题是关于函数闭包的 var .

    请给我一个详细的解释(按照作用域链在内存中定位变量),谢谢。

    1 回复  |  直到 1 年前
        1
  •  0
  •   Jaxon M    1 年前

    在Kotlin和Swift使用 var 意味着闭合捕获 参考 到变量本身,而不可变的val/lit捕获 价值 在创建闭包时变量的。

    按照你给出的例子,如果你用val代替,你会得到以下结果:

    val x = 1 
    val g = { x + 3 }  // Closure g captures the value 1
    x = 2 // this would cause compilation error 
    
    val z = g()    // z will be 4 (1 + 3)