Lua中的const和close关键字真的有用吗?

我很激动地发现,从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()的调用在函数结尾时输出“closed!”,但这并没有发生。我找不到很多这些关键字用法的示例。我是否使用它们正确?它们工作吗?

注意:lua -v => Lua 5.4.0 Copyright (C) 1994-2020 Lua.org, PUC-Rio

点赞
用户4605105
用户4605105

这是 <const> 而不是 const,以及 <close> 而不是 close

参见 https://lwn.net/Articles/826134/

do
  local x <const> = 42
  x = x+1
end
-- 错误:企图分配给常量变量'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"))

2021-04-14 22:04:20
用户2858170
用户2858170

Lua 5.4参考手册:3.3.7-局部声明

每个变量名都可以由属性(尖括号之间的名称)后缀

attrib ::= [ ' <' Name ' >' ]

有两种属性:const,声明常量变量,即变量初始化后无法分配的变量;and close,声明待关闭变量

例如,您必须编写 local x <const> = 3.

你的代码local const x = 3相当于

local const = nil
x = 3

因此,您实际上正在创建本地空值const和全局数字值x

2021-04-15 07:38:11