Object.assign()
是 JavaScript 中的一个方法,用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
Lua 是一种轻量级的脚本语言,广泛用于嵌入式系统和游戏开发。Lua 没有内置的 Object.assign()
方法,但可以通过自定义函数实现类似的功能。
Object.assign()
:Object.assign()
:Object.assign()
:Object.assign()
const target = { a: 1 };
const source1 = { b: 2 };
const source2 = { c: 3 };
Object.assign(target, source1, source2);
console.log(target); // 输出: { a: 1, b: 2, c: 3 }
function object_assign(target, ...)
for _, source in ipairs({...}) do
for k, v in pairs(source) do
target[k] = v
end
end
return target
end
local target = { a = 1 }
local source1 = { b = 2 }
local source2 = { c = 3 }
object_assign(target, source1, source2)
print(table.concat({table.unpack(target)}, ", ")) -- 输出: a = 1, b = 2, c = 3
原因: Lua 的表是引用类型,直接赋值会导致嵌套表也被引用。
解决方法: 使用递归函数来深度复制嵌套表。
function deep_copy(orig)
local orig_type = type(orig)
local copy
if orig_type == 'table' then
copy = {}
for orig_key, orig_value in next, orig, nil do
copy[orig_key] = deep_copy(orig_value)
end
setmetatable(copy, deep_copy(getmetatable(orig)))
else
copy = orig
end
return copy
end
local target = { a = 1, b = { c = 2 } }
local source = { b = { d = 3 }, e = 4 }
object_assign(target, source)
print(table.concat({table.unpack(target)}, ", ")) -- 输出: a = 1, b = table: 0x..., e = 4
通过递归复制,可以确保嵌套表也被正确复制,而不是被引用。
领取专属 10元无门槛券
手把手带您无忧上云