Lua 中的函数可以在调用之间存储本地值?
Functions in Lua could store local values between calls?
我正在阅读 "Programming in Lua",但我不理解这段代码中 Lua 中函数的行为:
function newCounter ()
local i = 0
return function () -- anonymous function
i = i + 1
return i
end
end
c1 = newCounter()
print(c1()) --> 1
print(c1()) --> 2
从我的角度来看,每个调用 c1()
都应该 return 1
因为 i
在 newCounter()
的开头被初始化为零。但它看起来像行
local i = 0
在 c1()
的调用中被跳过。 newCounter()
表现得像对象而不是函数。略懂Scheme和C#,对first-class函数比较熟悉。函数 return 函数对我来说没问题,但它如何在调用之间存储 i
的值?
这是"normal"函数和闭包之间的区别。
对于匿名函数来说,i
不是局部变量,也不是全局变量。它被称为非局部变量。请注意,执行匿名函数时 i
超出范围:
print(c1()) --> 1
print(c1()) --> 2
这里的重点是,i
的值在匿名函数中存储。该函数和所有非局部变量一起构成一个闭包。
您可以将 i
视为仅对 C1
可见的全局变量。
我正在阅读 "Programming in Lua",但我不理解这段代码中 Lua 中函数的行为:
function newCounter ()
local i = 0
return function () -- anonymous function
i = i + 1
return i
end
end
c1 = newCounter()
print(c1()) --> 1
print(c1()) --> 2
从我的角度来看,每个调用 c1()
都应该 return 1
因为 i
在 newCounter()
的开头被初始化为零。但它看起来像行
local i = 0
在 c1()
的调用中被跳过。 newCounter()
表现得像对象而不是函数。略懂Scheme和C#,对first-class函数比较熟悉。函数 return 函数对我来说没问题,但它如何在调用之间存储 i
的值?
这是"normal"函数和闭包之间的区别。
对于匿名函数来说,i
不是局部变量,也不是全局变量。它被称为非局部变量。请注意,执行匿名函数时 i
超出范围:
print(c1()) --> 1
print(c1()) --> 2
这里的重点是,i
的值在匿名函数中存储。该函数和所有非局部变量一起构成一个闭包。
您可以将 i
视为仅对 C1
可见的全局变量。