本文简单介绍了一些 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 算法:

-- convert to generational gc
collectgarbage("generational")
-- convert to incremental gc
collectgarbage("incremental")

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

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 离开作用域的时候被调用:

local tbcmt = { __close = function() print("close to-be-closed var")end
}local function create_tbcv()local tbcv = {}setmetatable(tbcv, tbcmt)return tbcv
enddolocal tbcv <close> = create_tbcv()
end

const (局部)变量

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

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 函数来触发一个警告:

warn("this is a warn")

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

lua_warning(L, "@on", 0);

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

void lua_setwarnf (lua_State *L, lua_WarnFunction f, void *ud);

undef ?

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

更多资料

  • Lua 5.4 的改进及 Lua 的版本演进
  • Lua 5.4.0 Released
  • Lua5.4新特性

Lua 5.4 新特性概览相关推荐

  1. SCCM 2012系列之新特性概览一:SCCM 2012安装选项和控制台新界面预览

    SCCM 2012系列之新特性概览一:SCCM 2012安装选项和控制台新界面预览. 众所周知,System Center Configuration Manager 2007(之前版本有SMS200 ...

  2. C# 8.0 的新特性概览和讲解

    本文转自 https://blog.csdn.net/hez2010/article/details/84036742 C# 8.0 的新特性概览和讲解 前言 新的改变 可空引用类型(Nullable ...

  3. ES6、 ES7、 ES8、 ES9、 ES10 新特性概览

    传送门:ES11.ES12.ES13 新特性概览 ES全称ECMAScript,ECMAScript是ECMA制定的标准化脚本语言.目前JavaScript使用的ECMAScript版本为ECMA-4 ...

  4. C++20新特性概览

    文章目录 C++20新特性概览 C++20的重要性 侧面说明: 正面说明: 模块(Modules) 优点 例子 创建模块 引用模块 范围库(Ranges) Ranges 是什么 ? 好处: 相关概念 ...

  5. Flutter Beta 3 新特性概览

    首先感谢 掘金 将本文纳入 Google I/O 2018 大会专题页中. 小集团队会持续跟进 Flutter 的动态,和大家一起来学习并推动 Flutter 的发展.我们还和阿里闲鱼团队合作,后期在 ...

  6. MongoDB 5.0新特性概览

    简介:MongoDB 5.0标志着一个新的发布周期的到来,以更快地交付新特性给到用户.版本化API与在线重新分片相结合,使用户不必担心未来的数据库升级以及业务变化问题:本地原生时间序列数据平台也使Mo ...

  7. Linux Kernel 3.0新特性概览(转)

    上周五,Linus Torvalds终于发布了备受瞩目的新一代Linux操作系统内核.Linux Kernel 3.0经过了七个RC候选版才推出正式版本,上一个版本是5月19日的2.6.39,也是2. ...

  8. Redis 6.0 新特性概览

    摘要:Redis 6.0 特性 点击阅读原文,提升阅读体验:https://www.modb.pro/db/22840?cyn 前言 Redis 6 RC2 于今年3月5号Release,预计今年4. ...

  9. mysql 5.6特性_MySQL 5.6新特性概览

    MySQL5.6 features This is the MySQL™ Reference Manual. It documents MySQL 5.6 through 5.6.28 添加的新特性( ...

最新文章

  1. 也谈谈程序员职业规划的几个问题——我的一些故事
  2. hive的变量传递设置
  3. 解决windows图片查看器背景色变成米黄色
  4. 迷你世界支持服务器,迷你世界云服务器
  5. boost::mpi::cartesian_communicator相关用法的测试程序
  6. java 获取当前月份的第一天_JAVA获取本月的第一天和最后一天
  7. HTML5 input 类型
  8. C++奥赛一本通递归题解
  9. linux 编译,链接和加载
  10. 10月21日Ajax培训日记
  11. 神策分析 Android SDK 之用户路径采集
  12. 如何用计算机术语写论文,计算机毕业论文结论怎么写?
  13. Company interview process
  14. Java代码实现奇数和偶数的判断
  15. Java基础学习笔记(十)——常用API(3)
  16. 牛牛战队的比赛地 (三分)
  17. latex footnote numbering
  18. [从头读历史] 第244节 三皇与五帝
  19. بۇر بىر سىناق
  20. 2023-03-27-安装office365显示Microsoft Office 专业增强版 2016

热门文章

  1. www.freedb.org--免费的CD歌曲信息库
  2. 抖音怎么删除自己的作品
  3. 【基于obs开发推流工具教程】-context 多线程问题
  4. vue 封装 axios 请求
  5. 【shell脚本】沐风晓月跟你聊聊shell脚本中的while循环
  6. java毕业设计轻纺城管理系统Mybatis+系统+数据库+调试部署
  7. 关于服务器如何设置动易系统数据库路径的方法
  8. Shell脚本中各种符号的意思
  9. python中的类及self详解
  10. c#画平行线和垂线的代码