1
9
找出它是如何实现的最简单的方法就是尝试它。编写一些使用捕获变量的代码,编译它,然后在 Reflector . 注意,这是 变量 它被捕获,而不是 价值 . 这是Java和C语言在这一领域的最大区别之一。 基本思想是,包含至少一个捕获变量的每个作用域级别都会生成一个新类,其中包含已捕获变量的字段。如果有多个级别,那么内部作用域也有下一个作用域的字段,以此类推。堆栈上真正的局部变量最终成为对自动生成类实例的引用。 下面是一个例子:
(如果你不抄一本课程,你会得到不同的结果-实验!)它被编译成如下代码:
每个
对捕获变量的引用最终会经过生成类的实例,因此它不仅仅是一次性的副本。(好的,在本例中,代码中没有其他内容使用捕获的变量,但您可以很容易地想象它可以使用这些变量。)注意,对于外部循环的任何一次迭代,五个新实例都共享
|
Abhijit Sarkar · 如何修复“闭包可能比当前函数更有效” 2 年前 |
Houman · 如果未调用闭包,如何使XCTest失败? 6 年前 |
Kapil_A · 如何将swift中使用的闭包写入目标c? 6 年前 |
Xendar · Jenkins管道模拟Groovy 6 年前 |
Ibrahim Mohammed · 函数不考虑闭包 6 年前 |