Lua多值赋值场景下如何省略不需要的中间返回值避免赋值给占位符_
Lua 跳过指定返回值的实现方案
有以下几种可以跳过第二个返回值、无需给_赋值的方案,可根据你的运行环境选择:
方案1:空变量占位(适配Lua 5.4+、支持该语法的LuaJIT版本)
Lua 5.4及以上版本原生支持多重赋值时留空变量位,直接省略不需要的返回值对应的变量声明即可,完全不会产生额外的变量赋值和内存占用:
local a, , b = f()
该方案性能最优,无任何额外开销,语法也最简洁。
方案2:临时表存储返回值(全版本通用)
如果你的运行环境不支持空变量占位,可以将函数的所有返回值存入临时表,再按索引取出需要的值:
local res = {f()} local a, b = res[1], res[3]
该方案兼容所有Lua版本,函数仅会执行一次,不存在副作用问题,仅会产生极少量的临时表创建开销,绝大多数业务场景下可以忽略不计。
方案3:select函数取值(仅适用于无副作用的纯函数)
如果f是无状态修改、无IO操作的纯函数,也可以通过select直接取指定位置的返回值:
local a = f() local b = select(3, f())
注意如果f存在副作用,两次调用会导致逻辑异常,不建议使用该方案。
补充说明
如果你仍然习惯用_作为占位符,也可以将相关逻辑包裹在局部作用域中,离开作用域后_占用的内存会被马上回收,不会长期占用内存:
do local a, _, b = f() -- 此处编写使用a、b的逻辑 end -- 作用域结束后_的内存可立即被GC回收
内容的提问来源于stack exchange,提问作者wimalopaan
相关产品推荐
相关产品推荐

