【问题标题】:Do the const and close keywords in Lua actually do anything?Lua 中的 const 和 close 关键字真的有什么作用吗?
【发布时间】:2021-04-14 20:48:20
【问题描述】:

我很高兴得知,从 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

【问题讨论】:

  • 下一次,如果您想知道如何正确使用 Lua 功能,最好参考 Lua 参考手册。猜测语法从来都不是一个好主意。
  • 是的,我试过了,但我只是不习惯 Lua 手册的组织方式。索引中对常量的唯一引用是关于 C API,当我在手册正文中搜索“const”时,我得到了很多关于“construct”的结果,所以我尝试通过添加空格来缩小搜索范围("const"),但是对 const 关键字的唯一引用后跟一个逗号,所以我再次主要得到了关于 C API 的结果。当时不知道是本地申报专属功能,也没想到去那里查。

标签: lua scope constants local-variables


【解决方案1】:

这是<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 &lt;const&gt; = 0

https://github.com/lua/lua/blob/master/testes/files.lua#L128

local f &lt;close&gt; = assert(io.open(file, "w"))

【讨论】:

    【解决方案2】:

    来自Lua 5.4 Reference Manual : 3.3.7 - Local Declarations

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

    属性 ::= ['']

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

    因此,例如,您必须写 local x &lt;const&gt; = 3

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

    local const = nil
    x = 3
    

    所以你实际上是在创建一个本地 nil 值 const 和一个全局数值 x

    【讨论】:

    • 我明白了。这确实有助于澄清为什么我的代码不是语法错误。我没有想到可以将局部变量声明为未初始化,因为对于全局变量,初始化和声明似乎不是不同的概念。
    猜你喜欢
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 2011-09-09
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多