Lua中是否有类似JavaScript的Object.assign方法简化嵌套赋值?
解答
引用赋值写法可行性
完全可行。Lua中的table(对应JS中的对象、数组)是引用类型,和你熟悉的JS对象引用逻辑完全一致:
ref = grandparent.parent.member只是将grandparent.parent.member指向的table的引用赋值给ref变量,二者指向内存中同一个table实例- 后续修改
ref的属性等价于直接修改原嵌套结构的对应属性,没有额外性能损耗,是Lua中非常普遍的简化写法。
类似Object.assign的实现方案
Lua标准库没有内置和Object.assign完全对应的API,但你可以自己快速实现一个通用工具函数,之后就可以一行完成批量属性赋值:
实现assign函数
function assign(target, ...) -- 遍历所有传入的源table for _, source in ipairs{...} do -- 把源table的所有键值对写入目标table for k, v in pairs(source) do target[k] = v end end return target end
使用方法
和JS的Object.assign行为完全一致,支持传入多个源table,同名属性后面的会覆盖前面的,属于浅拷贝:
assign(grandparent.parent.member, { prop1 = "val1", prop2 = val2, prop3 = {foo = "bar"} })
如果不想额外定义全局函数,也可以用匿名函数实现一次性的一行赋值,可读性稍差但不需要额外声明函数:
(function(t, s) for k, v in pairs(s) do t[k] = v end end)(grandparent.parent.member, {prop1 = "val1", prop2 = val2})
内容的提问来源于stack exchange,提问作者wololoo
相关产品推荐
相关产品推荐

