如何解决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 举报,一经查实,本站将立刻删除。