Lua 中的 const 和 close 关键字真的有作用吗?
Do the const and close keywords in Lua actually do anything?
我很高兴得知,从 Lua 5.4 开始,Lua 支持常量 (const
) 和待关闭 (close
) 变量!但是,在测试这些关键字时,它们似乎根本没有做任何事情。我编写了以下代码来对功能进行采样,以便更好地掌握它们的确切用法:
function f()
local const x = 3
print(x)
x = 2
print(x)
end
f()
function g()
local close x = {}
setmetatable(x, {__close = function() print("closed!") end})
end
g()
我将文件命名为 constCheck.lua
,运行 命名为 lua constCheck.lua
。输出结果如下:
3
2
我预计我调用 f()
时会出现错误,或者至少它会打印 3
两次,但它似乎可以毫无问题地重新分配 x
。此外,我期待调用 g()
打印出“关闭!”当 x
在函数末尾离开作用域时,但这并没有发生。我找不到很多这些关键字用法的例子。我是否正确使用它们?它们有效吗?
注:lua -v => Lua 5.4.0 Copyright (C) 1994-2020 Lua.org, PUC-Rio
这是<const>
不是const
,<close>
不是close
见https://lwn.net/Articles/826134/
do
local x <const> = 42
x = x+1
end
-- ERROR: attempt to assign to const variable 'x'
还有一些例子https://github.com/lua/lua/blob/master/testes/code.lua#L11
local k0aux <const> = 0
https://github.com/lua/lua/blob/master/testes/files.lua#L128
local f <close> = assert(io.open(file, "w"))
来自Lua 5.4 Reference Manual : 3.3.7 - Local Declarations
Each variable name may be postfixed by an attribute ( a name between angle brackets):
attrib ::= [‘<’ Name ‘>’]
There are two possible attributes: const, which declares a constant
variable, that is, a variable that cannot be assigned to after its
initialization; and close, which declares a to-be-closed variable
所以你必须写 local x <const> = 3
例如。
您的代码 local const x = 3
等同于
local const = nil
x = 3
所以你实际上是在创建一个本地 nil 值 const
和一个全局数值 x
.
我很高兴得知,从 Lua 5.4 开始,Lua 支持常量 (const
) 和待关闭 (close
) 变量!但是,在测试这些关键字时,它们似乎根本没有做任何事情。我编写了以下代码来对功能进行采样,以便更好地掌握它们的确切用法:
function f()
local const x = 3
print(x)
x = 2
print(x)
end
f()
function g()
local close x = {}
setmetatable(x, {__close = function() print("closed!") end})
end
g()
我将文件命名为 constCheck.lua
,运行 命名为 lua constCheck.lua
。输出结果如下:
3
2
我预计我调用 f()
时会出现错误,或者至少它会打印 3
两次,但它似乎可以毫无问题地重新分配 x
。此外,我期待调用 g()
打印出“关闭!”当 x
在函数末尾离开作用域时,但这并没有发生。我找不到很多这些关键字用法的例子。我是否正确使用它们?它们有效吗?
注:lua -v => Lua 5.4.0 Copyright (C) 1994-2020 Lua.org, PUC-Rio
这是<const>
不是const
,<close>
不是close
见https://lwn.net/Articles/826134/
do
local x <const> = 42
x = x+1
end
-- ERROR: attempt to assign to const variable 'x'
还有一些例子https://github.com/lua/lua/blob/master/testes/code.lua#L11
local k0aux <const> = 0
https://github.com/lua/lua/blob/master/testes/files.lua#L128
local f <close> = assert(io.open(file, "w"))
来自Lua 5.4 Reference Manual : 3.3.7 - Local Declarations
Each variable name may be postfixed by an attribute ( a name between angle brackets):
attrib ::= [‘<’ Name ‘>’]
There are two possible attributes: const, which declares a constant variable, that is, a variable that cannot be assigned to after its initialization; and close, which declares a to-be-closed variable
所以你必须写 local x <const> = 3
例如。
您的代码 local const x = 3
等同于
local const = nil
x = 3
所以你实际上是在创建一个本地 nil 值 const
和一个全局数值 x
.