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 ...
随机推荐
- 玩转C语言链表-链表各类操作详解
链表概述 链表是一种常见的重要的数据结构.它是动态地进行存储分配的一种结构.它可以根据需要开辟内存单元.链表有一个"头指针"变量,以head表示,它存放一个地址.该地址指向一个元素 ...
- Linux过来人帮你理清学习思路
很多同学接触linux不多,对linux平台的开发更是一无所知. 而现在的趋势越来越表明,作为一个优秀的软件开发人员,或计算机it行业从业人员,="" 掌握linux是一种很重要的 ...
- 常用Java API:HashMap 和 TreeMap
摘要 本文主要介绍Map接口下的HashMap和TreeMap. HashMap HashMap是基于哈希表的 Map 接口的实现,是无序的 clear()//清空. containsKey(Obje ...
- 21.8.7 test
\(NOIP\) 测试 考的一般般. \(T1\) WOJ4656 签到题,其实就是算 \(\sum\limits_{i=1}^n i^2\) #include<bits/stdc++.h> ...
- Git新建本地分支
作为一名码农,Git的使用就像家常便饭,时时刻刻都要用到. 通常我们在开发或者调试某个功能的时候,一般会从主分支新开一个单独的分支仅供自己使用,当我们开发完成后在提交合并请求给管理员,管理员进行代码审 ...
- reorder-list leetcode C++
Given a singly linked list L: L 0→L 1→-→L n-1→L n, reorder it to: L 0→L n →L 1→L n-1→L 2→L n-2→- You ...
- hdu 5175 Misaki's Kiss again(GCD和异或)
题意: 给一个数N. 如果GCD(N,M) = N XOR M,则称M是一个kiss 1<=M<=N 问总共有多少个kiss.并且列出所有的值. 思路: 思路一:枚举M.有大量的GCD ...
- newusers 拷贝服务器A上的用户,批量添加到其它服务器
服务器B 需要添加多个用户,要求与服务器A 的用户列表一致 1.拷贝服务器A 上的 /etc/passwd 中用户信息,用user1-10为例 #grep ^user /etc/passwd > ...
- 删除html标签,取其中的文本
public String removeHtmlTags() { String str = "<p><b> welcome to test</b>< ...
- Intellij Idea显示回退和前进按钮的方法
方法1:使用快捷键: 回到上一步 ctrl + alt + <-(左方向键) 回到下一步 ctrl + alt + ->(右方向键) 方法2:在界面显示: View -> 勾选To ...