lua5.4 beta中的to-be-closed变量的用法
Posted babypapa
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上是关于lua5.4 beta中的to-be-closed变量的用法的主要内容,如果未能解决你的问题,请参考以下文章
xmake v2.6.1 发布,使用 Lua5.4 运行时,Rust 和 C++ 混合编译支持