Lua 在线运行(5.1 / 5.3)

左边写代码,点运行,右边出结果,代码全在浏览器里跑、不上传。 两个版本都在:Lua 5.1 是课程正文与老引擎用的版本(编译成 WebAssembly 的解释器), Lua 5.3 是新版引擎用的版本(fengari 实现)。左边切换版本,同一段代码可以对比着看。

代码
Ctrl + Enter 运行
输出未运行
点「运行」执行上面的代码。
5.1 的除法是浮点除法,但打印出来是 10 而不是 10.0。这两件事要分开看。

这个运行器的边界

先说清楚它做不到什么,免得白白试半天
版本
两个都能跑: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.1Lua 5.3
print(_VERSION)Lua 5.1Lua 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 秒还没结束会强制中止, 页面不会卡死,改完可以直接重跑。