Lua 中的 const 和 close 关键字实际上有什么作用吗?

Cha*_*lim 3 lua scope constants local-variables

我很高兴地了解到,从 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()
Run Code Online (Sandbox Code Playgroud)

我为文件命名constCheck.lua并使用lua constCheck.lua. 输出如下:

3
2
Run Code Online (Sandbox Code Playgroud)

我期待在调用 时出现错误f(),或者至少要打印3两次,相反,它似乎重新分配x没有任何问题。此外,我期待调用g()打印出“关闭!” 当x在函数结束时离开作用域时,但这并没有发生。我找不到很多关于这些关键字用法的例子。我是否正确使用它们?做他们的工作?

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

Pig*_*let 7

来自Lua 5.4 参考手册:3.3.7 - 本地声明

\n
\n

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

\n

attrib ::= [\xe2\x80\x98<\xe2\x80\x99 名称 \xe2\x80\x98>\xe2\x80\x99]

\n

有两种可能的属性: const,声明常量变量,即初始化后不能赋值的变量;和 close,声明一个要关闭的变量

\n
\n

所以你必须写local x <const> = 3例如。

\n

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

\n
local const = nil\nx = 3\n
Run Code Online (Sandbox Code Playgroud)\n

所以你实际上是在创建一个局部 nil 值const和一个全局 number value x

\n


Ôre*_*rel 5

<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'
Run Code Online (Sandbox Code Playgroud)

还有一些例子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"))