为何Lua中调用返回闭包的iter()函数需先赋值给变量?
为什么直接调用
iter()无效,赋值给变量后才行? 嘿,这个问题的核心其实是Lua里**闭包(Closure)**的工作机制,咱们把两段代码拆开来看就清楚了:
先看无法运行的第一段代码
function iter() local i=0 return function() print(i); i=i+1; end end iter() iter()
每次调用iter()的时候,Lua都会完整执行一遍iter的函数体:
- 创建一个全新的局部变量
i,初始值设为0 - 返回一个绑定了这个新
i的闭包函数
但这里你调用iter()之后,并没有把返回的闭包保存下来,更没有去执行它!所以两次iter()只是生成了两个完全独立的闭包实例,各自持有自己的i=0,但它们根本没被触发执行,自然不会有任何输出。
再看能正常运行的第二段代码
function iter() local i=0 return function() print(i); i=i+1; end end it=iter() it() it()
这里的关键是it=iter():你把iter()返回的同一个闭包赋值给了变量it。这个闭包会牢牢“抓住”iter函数里的那个局部i,每次调用it()都会复用这个i:
- 第一次调用
it():打印当前的i(也就是0),然后把i加1变成1 - 第二次调用
it():打印现在的i(1),再把i加1变成2
这就是为什么你能看到预期的输出结果。
补充个小总结
闭包的核心特性是捕获并保留它所在环境的局部变量,而且每个闭包实例都是独立的——每次调用iter()都会生成一个新的闭包,每个闭包都有自己专属的i变量。你直接调用iter()却不用它的返回值,就相当于白创建了闭包,根本没用到它的功能;只有把闭包保存下来反复调用,才能让它持续修改同一个i。
内容的提问来源于stack exchange,提问作者Mick Breiting
相关产品推荐
相关产品推荐

