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.

相关推荐
开开心心_Every4 天前
黄金价格软件国内外价格实时监控超方便
运维·服务器·游戏·智能手机·pdf·lua·perl
笨鸟先飞的橘猫5 天前
C 扩展开发指南:从 Lua 到 skynet 的完整链路
c语言·lua
贾宝玉的玉宝贾7 天前
FreeSWITCH 简单图形化界面 70 - 监听/密语的lua脚本
开发语言·junit·lua·voip·freeswitch·sip·ippbx
二喵❥(^_-)11 天前
接口测试流程的三个核心环节
开发语言·lua
小师兄吃牛肉17 天前
C++ 与 Lua 的协程交互:从原理到实战
c++·lua·交互
喜欢的名字被抢了17 天前
09-Redis 进阶原理篇:单线程、多线程、过期、LRU-LFU、Fork 与 Lua
数据库·redis·lua
白山编程大哥18 天前
Lua 中使用 C 语言的用户自定义类型——userdata
c语言·junit·lua
大侠归来20 天前
C++ 与 Lua 的协程交互:从原理到实战
c++·lua·交互
疯狂成瘾者21 天前
海康 Artemis 接口对接
开发语言·lua
一线灵21 天前
跨平台游戏引擎 Axmol-2.11.5 发布
游戏引擎·lua