对应目前最新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. CSS 盒子的边距塌陷

    tip:为能更直观地学习,本文章已省略部分 css 样式代码. 我相信下面的情形大家在日常工作中常常碰到:在制作静态页面中,为了页面整体的协调与美观,我们想让子盒子 image-div 的上边沿距离父 ...

  2. Win powershell执行策略配置

    参考连接:https://blog.csdn.net/jeffxu_lib/article/details/84710386 参考连接:http://www.cragsman.org/index.ph ...

  3. Zabbix5.0实现监控系统登陆失败告警

    环境zabbix5.0,配置思路,通过添加监控项和触发器实现,监控项监控对应的日志文件,触发器过滤日志文件中的关键字,当出现failed时就发出告警. 监控项配置 类型选择zabbix客户端主动式,键 ...

  4. httprunner3源码解读(2)models.py

    源码目录结构 我们首先来看下models.py的代码结构 我们可以看到这个模块中定义了12个属性和22个模型类,我们依次来看 属性源码分析 import os from enum import Enu ...

  5. Typecho 反序列化漏洞 分析及复现

    0x00 漏洞简介 CVE-2018-18753 漏洞概述: typecho 是一款非常简洁快速博客 CMS,前台 install.php 文件存在反序列化漏洞,通过构造的反序列化字符串注入可以执行任 ...

  6. Qt 使用大神插件快速创建树状导航栏

    前言 本博客仅仅记录自己的采坑过程以及帮助网友避坑,方便以后快速使用自定义控件,避免重复出错. 下载插件 大神 Github Qt 自定义控件项目地址:https://github.com/feiya ...

  7. Linux mem 2.6 Rmap 内存反向映射机制

    文章目录 1. 简介 2. 匿名内存 Rmap 的建立 2.1 fork() 2.2 do_page_fault() 3. 文件内存 Rmap 的建立 3.1 fork() 3.2 do_page_f ...

  8. js实现全选与全部取消功能

    function checkAll() { //把所有参与选择的checkbox使用相同的name,这里为"num_iid"    var eles = document.getE ...

  9. Spark面试题(五)——数据倾斜调优

    1.数据倾斜 数据倾斜指的是,并行处理的数据集中,某一部分(如Spark或Kafka的一个Partition)的数据显著多于其它部分,从而使得该部分的处理速度成为整个数据集处理的瓶颈. 数据倾斜俩大直 ...

  10. Databend 社区积极拥抱 Rust 生态(202111回顾)

    Databend 旨在成为一个 开源.弹性.可靠 的无服务器数仓,查询快如闪电,与 弹性.简单.低成本 的云服务有机结合.数据云的构建,从未如此简单! Databend 对 Rust 社区的意义 Da ...