微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我很高兴地了解到,从 Lua 5.4 开始,Lua 支持常量 (CREATE TABLE public.site ( id integer NOT NULL,PRIMARY KEY (id) ); CREATE TABLE public.treatment_contract ( site_id integer NOT NULL,start_date date NOT NULL,end_date date NOT NULL,PRIMARY KEY (site_id,start_date,end_date),CONSTRAINT fk_treatment_contract__site FOREIGN KEY (site_id) REFERENCES public.site (id) MATCH SIMPLE ); CREATE TABLE public.machine ( id integer NOT NULL,PRIMARY KEY (id) ); CREATE TABLE public.machine_deployment ( site_id integer NOT NULL,machine_id integer NOT NULL,contract_start_date date NOT NULL,contract_end_date date NOT NULL,machine_id,CONSTRAINT fk_machine_deployment__machine FOREIGN KEY (machine_id) REFERENCES public.machine (id) MATCH SIMPLE,CONSTRAINT fk_machine_deployment__treatment_contract FOREIGN KEY (site_id,contract_start_date,contract_end_date) REFERENCES public.treatment_contract(site_id,CONSTRAINT chk_machine_deploiment_period CHECK (start_date <= end_date),CONSTRAINT chk_machine_deploiment_in_contract CHECK (pg_catalog.daterange(start_date,end_date,'[]') <@ pg_catalog.daterange(contract_start_date,contract_end_date,'[]')) ); CREATE TABLE public.treatment_datapoint ( site_id integer NOT NULL,time_stamp timestamp NOT NULL,time_stamp),CONSTRAINT fk_treatment_datapoint__treatment_contract FOREIGN KEY (site_id,CONSTRAINT chk_datapoint_in_contract CHECK (time_stamp::date <@ pg_catalog.daterange(contract_start_date,'[]')) ); ) 和要关闭的 (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

解决方法

这是CREATE OR REPLACE TABLE my-dataset.trees_temp OPTIONS( expiration_timestamp=TIMESTAMP "2021-04-15 00:00:00 UTC" ) as ( SELECT t95.* FROM bigquery-public-data.new_york_trees.tree_census_1995 as t95 JOIN bigquery-public-data.new_york_trees.tree_census_2005 as t05 ON t95.diameter = t05.tree_dbh WHERE diameter > 30 ) 不是<const>const不是<close>

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

close

还有一些例子https://github.com/lua/lua/blob/master/testes/code.lua#L11

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/files.lua#L128

local k0aux <const> = 0

,

来自Lua 5.4 Reference Manual : 3.3.7 - Local Declarations

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

属性::= [‘’]

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

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

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

local const = nil
x = 3

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。