前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Lua 5.4 新特性概览

Lua 5.4 新特性概览

作者头像
用户2615200
发布2020-07-09 15:57:25
2.8K0
发布2020-07-09 15:57:25
举报

本文简单介绍了一些 Lua 5.4 的新特性

Lua 5.4 正式发布了,很多朋友应该会比较好奇 Lua 5.4 与之前版本的区别,本文就此简单介绍一些 Lua 5.4 的新特性.

完整的 Lua 5.4 变更列表可以在这里找到,本文我们仅简单概览下其中主要的几点变化:

分代 GC

之前 Lua 采用的是 分步 GC 算法来进行垃圾回收, Lua 5.4 加入了 分代 GC 算法,值得注意的一点是, Lua 5.4 仍然支持 分步 GC 算法(并且目前 分步 GC 算法仍然是默认的 GC 算法),我们可以通过调用 collectgarbage 来切换当前使用的 GC 算法:

代码语言:javascript
复制
-- convert to generational gc
collectgarbage("generational")
代码语言:javascript
复制
-- convert to incremental gc
collectgarbage("incremental")

之前 collectgarbage 方法支持的两个设置 “setpause” 和 “setstepmul”,在 Lua 5.4 中已经不再支持,目前我们需要借助 “incremental” 来完成相关变量的设置:

代码语言:javascript
复制
collectgarbage("incremental", pause, stepmul, stepsize)
to-be-closed (局部)变量

Lua 5.4 引入了 to-be-closed (局部)变量,机制上可类比 C# 中的 using 语句,实现了类似于 Dispose 的编程模式,只是 C# 中的 Dispose 编程模式通过 Dispose 方法来进行资源的释放,而 Lua 5.4 中的 to-be-closed (局部)变量 则是使用 __close 元方法.

下面是一段示例代码,其中 tbcv 元表的 __close 元方法会在 tbcv 离开作用域的时候被调用:

代码语言:javascript
复制
local tbcmt = { 
    __close = function() 
        print("close to-be-closed var")
    end
}

local function create_tbcv()
    local tbcv = {}
    setmetatable(tbcv, tbcmt)
    return tbcv
end
    
do
    local tbcv <close> = create_tbcv()
end
const (局部)变量

const (局部)变量只能在初始化时赋值,之后对该变量的赋值操作都会被认为是不合法的:

代码语言:javascript
复制
local cv <const> = {}
cv.name = "name" 
-- error: attempt to assign to const variable
cv = {}
math.random 的重新实现

之前 Lua 中的 math.random 是基于 C 语言库函数 rand() 来实现的, 这给跨平台开发带来了一些问题,因为不同平台的 C 语言运行时 对 rand() 的实现并不相同,所以会造成 rand() 返回结果不一致的问题(在各个平台间), Lua 5.4 基于 xoshiro256** 重新实现了 math.random, 继而解决了该问题.

警告系统

Lua 5.4 新添加了一个警告系统,我们可以通过 warn 函数来触发一个警告:

代码语言:javascript
复制
warn("this is a warn")

但是在 Lua 5.4 的 default 实现中,警告系统是默认关闭的,想要开启的话,需要在 C 语言侧调用 lua_warning 来进行开启:

代码语言:javascript
复制
lua_warning(L, "@on", 0);

当然,我们也可以通过调用 lua_setwarnf 来替换 Lua 5.4 的 default 实现:

代码语言:javascript
复制
void lua_setwarnf (lua_State *L, lua_WarnFunction f, void *ud);
undef ?

Lua 5.4 初期还支持 undef 关键字,用以解决不能给 table 元素进行 nil 赋值的问题(有兴趣的朋友可以自行搜索相关细节),该特性引起了不少争论,后面 Lua 5.4 去除了对该特性的支持.

更多资料
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-07-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 分代 GC
  • to-be-closed (局部)变量
  • const (局部)变量
  • math.random 的重新实现
  • 警告系统
  • undef ?
  • 更多资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档