Lua 在线运行(5.1 / 5.3)
左边写代码,点运行,右边出结果,代码全在浏览器里跑、不上传。 两个版本都在:Lua 5.1 是课程正文与老引擎用的版本(编译成 WebAssembly 的解释器), Lua 5.3 是新版引擎用的版本(fengari 实现)。左边切换版本,同一段代码可以对比着看。
代码
输出未运行
点「运行」执行上面的代码。
这个运行器的边界
先说清楚它做不到什么,免得白白试半天- 版本
- 两个都能跑:Lua 5.1(课程正文与老引擎用的版本,编译成 WebAssembly)和 Lua 5.3(新版引擎的版本,fengari 实现)。跑一次 print(_VERSION) 就能自证,左边先切版本再运行。
- 没有引擎 API
- GetGold、BridgeFunctionAttach、LoadJsonFile 这些在这里不存在,第三部分之后的示例代码跑不了
- 没有文件与网络
- io 只接到输出区,不碰你的磁盘,也不发任何请求
- 标识符只能是英文
- 标准 Lua 5.1 的变量名不支持中文:local 名字 = 1 就是语法错误;字符串里的中文没问题
- 超时 6 秒
- WebAssembly 没法被抢占,死循环只能连线程一起中止,然后自动重建运行环境
- 隐私
- 代码只在你的浏览器里跑,不会上传到任何地方
两个版本怎么选
- 先确认你的引擎是哪个版本。老引擎内置 Lua 5.1,新版引擎内置 Lua 5.3; 课程正文按 5.1 写,写的代码在 5.3 上基本都能跑,反过来不一定: 整除运算符
//、goto、位运算符在 5.1 里是语法错误。 - 数字打印是最容易踩的差别:5.1 只有双精度浮点,
print(8/2)打印4;5.3 区分整数与浮点,同样一行会打印4.0,math.type(8/2)也会告诉你它是integer。 - 不确定就切到对应版本跑一次
print(_VERSION),比记规则靠谱。 5.1 那份是编译成 WebAssembly 的解释器;5.3 那份是浏览器里实现的 fengari,语义按 5.3 走。 - 第一次运行要下载对应运行时(5.1 约 430 KB,5.3 约 510 KB),之后走浏览器缓存; 两个版本互不干扰,切回去也不用重下。
Lua 5.1 与 Lua 5.3 有什么区别
同一段代码切版本跑两次,差别一眼能看出来| 写法 | Lua 5.1 | Lua 5.3 |
|---|---|---|
print(_VERSION) | Lua 5.1 | Lua 5.3 |
print(8 / 2) | 4(只有双精度浮点) | 4.0(整数与浮点分开) |
math.type(8 / 2) | 没有这个函数 | float;math.type(8) 是 integer |
10 // 3 整除 | 语法错误 | 3 |
10 & 3 位运算 | 语法错误 | 2 |
goto 语句 | 语法错误 | 可用 |
table.getn | 还在(已过时) | 已移除,用 #t |
utf8 库 | 没有 | 有,utf8.char(0x4e2d) → 中 |
loadstring | 可用 | 已移除,用 load |
写脚本前先确认引擎版本:老引擎内置 5.1,新版引擎内置 5.3。 5.1 的写法在 5.3 上基本都能跑,反过来不一定,最典型的就是上表里的 //、位运算和 goto。
这个运行器能跑什么、不能跑什么
- 能跑
- 标准 Lua 语法与标准库:变量、表、函数与闭包、协程、字符串与模式匹配、
math/os/table/string, 以及协程与元表。课程第一、二部分的示例都能直接粘进来跑。 - 不能跑
- 引擎接口。像
giveitem、changemoney、sendmsg这类全局函数 只有引擎里有,运行器里没有,会报attempt to call a nil value。 查这类接口请用 文档检索。 - 代码会上传吗
- 不会。解释器本身跑在浏览器里,代码只在你的机器上执行,页面也不联网发代码。
常见报错与疑问
- 报 unexpected symbol near '/' 怎么办
- 这是把 5.3 才有的整除运算符
//写进了 5.1。要么切到 5.3 运行, 要么改成math.floor(a / b)。位运算&、|、goto同理。 - 为什么 print(8/2) 显示 4.0
- 你在 5.3 下跑。5.3 区分整数与浮点,除法的结果是浮点,所以打印带小数位; 5.1 只有双精度,打印
4。要整数结果用8 // 2或math.floor(8/2)。 - 为什么引擎里能跑、这里报 nil
- 引擎接口不在标准库里。先在文档检索里确认函数名与参数, 再到引擎里跑;运行器只适合验证纯 Lua 语法与算法。
- 卡住不动是怎么回事
- 多半是死循环(
while true do end)。运行器 6 秒还没结束会强制中止, 页面不会卡死,改完可以直接重跑。