lua vm 四: 表达式

lua 的表达式有一些特殊情况。


1. 被括号包起来的表达式永远被当成一个值1

(f(x,y,z)),即使 f 返回多个值,这个表达式永远是单个值。


2. 多返回值的调整1

函数调用和变长参数表达式都会产生多个值,这些表达式被称为多返回值表达式(multires expressions)。

根据多返回值表达式所处的位置,有两条规则:

  • 规则一:当多返回值表达式(multires expressions)被放在表达式列表(a list of expressions)的末尾时,此多返回值表达式的所有值会被加入此表达式列表的值列表中。

  • 规则二:当多返回值表达式被用于表达式列表但却没有出现在末尾时,此多返回值表达只有第一个值会被加入此表达式列表的值列表中。

以下是一些例子:

  • local x, y, z = 10, f(), x 取得 10,y 取得 f() 的第一个返回值,z 取得 f() 的第二个返回值。(规则一)

  • local x, y, z = f(), 10, x 取得 f() 的第一个返回值,y 取得 10,z 取得 nil。(规则二)

  • local x, y, z = f(), g(),x 取得 f() 的第一个返回值,y 取得 g() 的第一个返回值,z 取得 g() 的第二个返回值。(f 是规则一,g 是规则二)

  • {f(), 10},由 f() 的第一个返回值和 10 构成的数组。(规则一)

  • {10, f()},由 10 和 f() 的所有返回值构成的数组。(规则二)


3. 参考

1 lua. Lists of expressions, multiple results, and adjustment. Available at https://lua.org/manual/5.4/manual.html#3.4.3.

相关推荐
肠畔码农2 天前
底层视角拆解:Redis Lua脚本原子性、主线程阻塞与主从不一致全解析
java·redis·lua
小的~~4 天前
面试被问懵了?为什么 Redis 单线程还能保证 Lua 脚本原子性,却偏偏选了 Lua?
redis·面试·lua
難釋懷5 天前
Nginx-Lua
nginx·junit·lua
mCell6 天前
Lua 编程入门:从基础语法到元表
javascript·算法·lua
小努蛋10 天前
linux编译openresty异常问题,lua_cjson.c:706:5: 错误: ‘for‘ 循环初始化声明只在 C99 或 C++ 模式下允许
开发语言·lua·openresty
rockey62712 天前
基于AScript的Lua脚本语言发布啦
c#·.net·lua·script·动态脚本
MC皮蛋侠客14 天前
Redis 系列(七):事务、Pipeline 与 Lua 脚本——从原子性到 Functions
数据库·redis·lua
l1t17 天前
用李红艳先生的DuckDB luajit插件批量计算数独
数据库·sql·lua·duckdb
智购科技自动售卖机厂家20 天前
从STM32到RK3588——自动售货机嵌入式主控方案的架构演进~YH
stm32·嵌入式硬件·物联网·架构·lua·零售·symfony
qq_3707730922 天前
Unity游戏xLua逆向实战:从SO版本识别到Lua脚本热替换全链路
游戏·unity·lua