lua5.4 beta中的to-be-closed变量的用法
对应目前最新lua5.4 beta版本:2019-10-09发布
这个功能之前修改过两次语法,当前的语法不出意外将会是最终决定了,目前还没有最新的中文资料,所以我来这里发一下。
先介绍下这个功能:
被标记为to-be-closed的局部变量,会在超出它的作用域时,调用它的__closed元方法,这就为我们提供了类似C++析构函数的作用。
所以一个被标记为to-be-closed的变量应该符合两个前提条件:
1、它是一个table
2、已经为它指定了__close元方法
当前版本语法:在变量名后添加<close>,将变量标记为to-be-closed变量
local t<close> = ...
示例:
function test2()
local t = {x=1};
setmetatable(t, {__close=function(...) print('close') end});
local tc<close> = t;
--函数返回时,将自动执行tc的__close元方法。
end
test2(); -- 以文件操作为例:
-- 在没有to-be-closed变量的情况下:
function foo()
-- 打开一个文件
local fd = io.open('c:\\1.txt', 'r'); -- 读取文件
local x = fd:read('*a'); -- 接下来就是对文件内容进行判断
-- 假如我们在逻辑上需要多种内容
if x == '1' then
fd:close();
return;
else if x == '2' then
print('文件内容为:2');
fd:close();
return;
end print('错误的文件内容:'..x);
fd:close();
end -- to-be-closed的情况下:
function foo2() -- 在变量名之后添加<close>
local fd<close> = io.open('c:\\1.txt', 'r');
-- 接下来就和 各种返回位置都要写的超级烦人的fd:close()说再见 -- 读取文件
local x = fd:read('*a');
if x == '1' then
return;
else if x == '2' then
print('文件内容为:2');
return;
end print('错误的文件内容:'..x); end -- 以实现c++的std::lock_guard为例:
-- xshare.lock xshare.unlock来自于我的另一篇文章:https://www.cnblogs.com/babypapa/p/11711389.html
function lock_guard(xt)
local t = {xstab = xt};
setmetatable(t, {__close=function(tab) xshare.unlock(tab.xstab) end})
xshare.lock(xt);
return t;
end function foo3(xt)
local lg<close> = lock_guard(xt);
...
end
然后,下面是吐槽
我只能说,罗伯托老兄不知道是在什么情况下的考虑,而设计出这种东西的,这绝对是思维掉坑了。
如果只考虑元方法,你偷懒就偷懒了,用表来实现,是可以理解的。
但使用了新的语法时,再依赖过去的元方法,就关系就混乱了,
语法是什么?更底层的东西。
而元方法的实现,首先暴露给用户的入口点就是一个函数。
然后很显然,底层依赖上层的关系出现了。
再来看同期的产物,const变量,只有local v<const> = ...这样的方式,并且它不作用于table内部。local t<const> = {a=1, b = 2}; t.a=11照样可以改。
当一个const变量,只能本地储存的时候,我们为何还要脱裤子放屁,我感觉,怕不是我自己对常量的定义有本质的误解。
我就想说,把const设计成一个函数不好吗?
local a, b, c = const(1, 2,3)
x,y,z = const(1,2,3)
local t = const({const(1, 2, 3)})
t = {const(1), 2, const(3)}
这种方式不比<const>容易实现,不能更容易满足大家的需求?
最后我想说,如果再继续偷懒,等到哪一天,这些问题被用户习惯掉之后,就像nil的天坑无法改变的时候,就晚了。
lua5.4 beta中的to-be-closed变量的用法的更多相关文章
- xcode6 beta 中智能提示(自动完成)功能有时不显示的问题
xcode6 beta 中智能提示(自动完成)功能有时不显示的问题 周银辉 xcode6 beta 中智能提示(自动完成)功能有时不显示,这让人很郁闷啊,网上老外的视频中看人家用的好好的. ...
- js中let和var定义变量的区别
let变量之前没见过,刚遇到,探探究竟. 以下转自:http://blog.csdn.net/nfer_zhuang/article/details/48781671 声明后未赋值,表现相同 (fun ...
- sql server存储过程中SELECT 与 SET 对变量赋值的区别
SQL Server 中对已经定义的变量赋值的方式用两种,分别是 SET 和 SELECT. 对于这两种方式的区别,SQL Server 联机丛书中已经有详细的说明,但很多时候我们 并没有注意,其实这 ...
- 在checkbox中使用.prop; angular中属性的值使用变量问题
1.在checkbox中使用.prop而不使用.attr ,.attr有时并不如愿的改变checkbox的打钩问题 给这个checkbox设置return false就能阻止点击则改变状态的默认行为 ...
- Oracle中INSTR、SUBSTR和NVL的用法
Oracle中INSTR.SUBSTR和NVL的用法 INSTR用法:INSTR(源字符串, 要查找的字符串, 从第几个字符开始, 要找到第几个匹配的序号) 返回找到的位置,如果找不到则返回0. 默认 ...
- JavaScript中常见的数组操作函数及用法
JavaScript中常见的数组操作函数及用法 昨天写了个帖子,汇总了下常见的JavaScript中的字符串操作函数及用法.今天正好有时间,也去把JavaScript中常见的数组操作函数及用法总结一下 ...
- JavaScript中常见的字符串操作函数及用法
JavaScript中常见的字符串操作函数及用法 最近几次参加前端实习生招聘的笔试,发现很多笔试题都会考到字符串的处理,比方说去哪儿网笔试题.淘宝的笔试题等.如果你经常参加笔试或者也是一个过来人,相信 ...
- SQL中CONVERT日期不同格式的转换用法
SQL中CONVERT日期不同格式的转换用法 格式: CONVERT(data_type,expression[,style]) 说明:此样式一般在时间类型(datetime,smalldatetim ...
- java中的static使用--静态变量、静态方法
Java 中的 static 使用之静态变量 大家都知道,我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立.然而在某些时候,我们更希望该类所有的对象共享同一个成员.此时就是 s ...
随机推荐
- Noip模拟74 2021.10.11
T1 自然数 考场上当我发现我的做法可能要打线段树的时候,以为自己百分之百是考虑麻烦了 但还是打了,还过掉了所有的样例,于是十分自信的就交了 正解还真是线段树,真就第一题数据结构 但是包括自己造的小样 ...
- AGC019F
题目大意 $n$ + $m$ 个问题,其中$n$ 个答案是$YES$,$m$个是$NO$的,你依次答题,每答一道,就可以立刻知道这道题的答案,求在最优策略下答错次数的期望,对$998244353$取模 ...
- linux上docker形式部署GB28181服务wvp,zlmedia
目录 1.bash方式从镜像创建docker 2.下载vim 3.修改run.sh bug如下 4.修改application.xml 5.运行一下sh run.sh 6.Vim config.ini ...
- hdu 5183 Negative and Positive (NP)(STL-集合【HASH】)
题意: When given an array (a0,a1,a2,⋯an−1) and an integer K, you are expected to judge whether there i ...
- Vue脚手架最新版本安装使用
现在很多的插件如Vant 这类的样式框架,都去兼容了Vue的3.0版本,所以我总结一下如何去简单的搭建一个Vue3.0的框架 开始 一,如何安装 在这里说明一下,Vue脚手架版本,和Vue版本是两个东 ...
- spring mvc 原理(快速理解篇)
这两张图大家应该都不陌生. 从图上来看就是:一个请求过来,front controller根据具体的请求路径分派到具体的controller,具体的controller处理请求并把处理结果返回给fro ...
- 部署自己的gitlab服务器
一.安装依赖环境,下载gitlab的rpm包,并且安装 yum install curl policycoreutils-python openssh-server postfix wget -ywg ...
- svg的animate动画动态加载删除遇到删除animate后再次加载的animate动画没有效果问题
svg上有多个圆圈,当选中特定圆圈后给其加上animate动画效果,并把其他圆圈的animate效果去除. 第一次选择一个点实现动画效果完全达到效果,因为是第一次所以不需要把其他圆圈的animate子 ...
- Linux 兴趣小组2016免试题 第四关揭秘
Linux 兴趣小组2016免试题 点这里 首先贴出第四关链接Linux 兴趣小组2016免试题 第四关 第四关: 进入网址我们看到的是4张扑克牌K,这是什么意思? 要我斗地主?好了,还是乖乖的先查看 ...
- 动态sql & 抽取可重用sql
抽取可重用的sql片段 抽取:<sql id="xx"></sql> 使用:<include refid="xx">< ...