对应目前最新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变量的用法的更多相关文章

  1. xcode6 beta 中智能提示(自动完成)功能有时不显示的问题

    xcode6 beta 中智能提示(自动完成)功能有时不显示的问题      周银辉 xcode6 beta 中智能提示(自动完成)功能有时不显示,这让人很郁闷啊,网上老外的视频中看人家用的好好的. ...

  2. js中let和var定义变量的区别

    let变量之前没见过,刚遇到,探探究竟. 以下转自:http://blog.csdn.net/nfer_zhuang/article/details/48781671 声明后未赋值,表现相同 (fun ...

  3. sql server存储过程中SELECT 与 SET 对变量赋值的区别

    SQL Server 中对已经定义的变量赋值的方式用两种,分别是 SET 和 SELECT. 对于这两种方式的区别,SQL Server 联机丛书中已经有详细的说明,但很多时候我们 并没有注意,其实这 ...

  4. 在checkbox中使用.prop; angular中属性的值使用变量问题

    1.在checkbox中使用.prop而不使用.attr ,.attr有时并不如愿的改变checkbox的打钩问题 给这个checkbox设置return  false就能阻止点击则改变状态的默认行为 ...

  5. Oracle中INSTR、SUBSTR和NVL的用法

    Oracle中INSTR.SUBSTR和NVL的用法 INSTR用法:INSTR(源字符串, 要查找的字符串, 从第几个字符开始, 要找到第几个匹配的序号) 返回找到的位置,如果找不到则返回0. 默认 ...

  6. JavaScript中常见的数组操作函数及用法

    JavaScript中常见的数组操作函数及用法 昨天写了个帖子,汇总了下常见的JavaScript中的字符串操作函数及用法.今天正好有时间,也去把JavaScript中常见的数组操作函数及用法总结一下 ...

  7. JavaScript中常见的字符串操作函数及用法

    JavaScript中常见的字符串操作函数及用法 最近几次参加前端实习生招聘的笔试,发现很多笔试题都会考到字符串的处理,比方说去哪儿网笔试题.淘宝的笔试题等.如果你经常参加笔试或者也是一个过来人,相信 ...

  8. SQL中CONVERT日期不同格式的转换用法

    SQL中CONVERT日期不同格式的转换用法 格式: CONVERT(data_type,expression[,style]) 说明:此样式一般在时间类型(datetime,smalldatetim ...

  9. java中的static使用--静态变量、静态方法

    Java 中的 static 使用之静态变量 大家都知道,我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立.然而在某些时候,我们更希望该类所有的对象共享同一个成员.此时就是 s ...

随机推荐

  1. STM32定时器学习---基本定时器

    STM32F1系列的产品,除了互联网产品外,工作8个,3种定时器,其中一种就是基本定时器.那么STM32单片机的基本定时器如何操作以及编程呢? 下面我们就来详细的了解一下 STM32F1系列的产品,除 ...

  2. pycharm软件安装和破解

    pycharm安装 1. 进入pycharm的官网 --- 下载专业版的pycharm 2. 双击下载好的软件,下一步 3. 选择需要安装软件的路径 --- 注意: 尽量不要将软件装在C盘里 4. 默 ...

  3. NOIP模拟88(多校21)

    前言 对于这套题的总体感觉就是难,然后就是自己很菜... 对于 T1 考试时只会一个最垃圾的背包,考完之后对于思路这一块也不是很顺利,大概这就是薄弱的地方吧. 然后 T2 是比较简单的一道题了,但是考 ...

  4. 使用google zxing生成二维码图片

    生成二维码工具类: 1 import java.awt.geom.AffineTransform; 2 import java.awt.image.AffineTransformOp; 3 impor ...

  5. 【Python+postman接口自动化测试】(4)HTTP 协议

    前言 HTTP:超文本传输协议,是用于从WWW服务器传输超文本到本地浏览器的传输协议. HTTP协议是一种无状态协议,主要包含请求和相应两大部分. 请求(Request) get请求示范: GET h ...

  6. robot framework 导入资源

    创建资源后添加关键字 创建资源文件用于存放关键字,项目下的所有套件都可以引用. 1.创建资源 测试项目->new resource->输入资源名称->点击"确认" ...

  7. Maven打包web项目报错:webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update)

    问题描述 使用Maven打包项目的时候,出现错误: webxml attribute is required (or pre-existing WEB-INF/web.xml if executing ...

  8. MyScript 开发文档

    一.IInk SDK runtime 1.1 引擎创建 1.2 对象释放 1.3 获取并设置配置 配置 访问配置 配置识别 二.文件存储 2.1 支持的内容的类型 2.2 模型结构 2.3 Conte ...

  9. 问题 B: 比大小

    题目描述 给你两个很大的数,你能不能判断出他们两个数的大小呢? 比如123456789123456789要大于-123456 输入 每组测试数据占一行,输入两个不超过1000位的10进制整数a,b 数 ...

  10. 大爽Python入门教程 3-3 循环:`for`、`while`

    大爽Python入门公开课教案 点击查看教程总目录 for循环 可迭代对象iterable 不同于其他语言. python的for循环只能用于遍历 可迭代对象iterable 的项. 即只支持以下语法 ...