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.