scala Closure自由变量

Tyr*_*ter 2 scala

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的闭包本身捕获变量,而不是变量引用的值.

sjr*_*jrd 6

这看起来像一个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.