val m1 = 99
val g = (_:Int) + m1
g(10) // returns 109
val m1 = 88
g(10) // returns 109
Run Code Online (Sandbox Code Playgroud)
var n1 = 99
val h = (_:Int) + n1
h(10) // returns 109
n1 = 88
h(10) // returns 98
var n1 = 66
h(10) // returns 98
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释这是如何工作的吗?为什么闭包不跟踪"自由变量"的变化?
下面的代码是用Scala编程编写的,但我发现很难将它链接到上面的场景:
Scala的闭包本身捕获变量,而不是变量引用的值.
这看起来像一个REPL会话.每次引入val m1或者var n1,您都会影响具有相同名称的变量的先前定义.阴影适用于此后发送到REPL的新行.但是已编译的行仍然引用旧变量.
通过重命名变量可以很容易地解释上述行为,从而不会发生阴影:每次重新声明某些内容时都会引入新名称.这会产生:
val m1 = 99
val g = (_:Int) + m1
g(10) // returns 109
val m2 = 88
g(10) // returns 109
Run Code Online (Sandbox Code Playgroud)
-
var n1 = 99
val h = (_:Int) + n1
h(10) // returns 109
n1 = 88
h(10) // returns 98
var n2 = 66
h(10) // returns 98
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,分别定义g和/ h仍然分别引用.新s和s 的定义无关紧要.m1n1valvar
但是,赋值n1 = 88不会引入新变量.它会更改现有变量的值n1.在这种情况下,请h查看更新后的值n1.