如何生成具有唯一内存地址的Lua表?
Lua中生成唯一内存地址表的解决方案
你的问题根源在于a.new函数始终返回同一个预先定义的表b——每次调用只是修改这个表的x、y值,并没有创建新表,所以所有插入到d里的条目都是指向同一个内存地址的引用,最终只会保留最后一次修改的值。
原问题代码
a.lua
local a = {} local b = {} b.x = 0 b.y = 0 b.z = 'Static' function a.new(x, y) b.x = x b.y = y return b end
b.lua
a = require 'a' d = {} table.insert(d, a.new(1, 2)) table.insert(d, a.new(2, 3))
解决方案:每次调用new时创建新表
要生成具有唯一内存地址的表,需要在a.new函数内部每次都新建一个表,而不是复用外部的b。可以把静态属性直接在新表里初始化,或者通过模板复制。
修改后的a.lua代码(简洁版):
local a = {} function a.new(x, y) -- 每次调用都创建全新的表并返回 return { x = x, y = y, z = 'Static' } end
如果需要复用静态模板(比如后续要统一修改静态属性),可以用模板复制的写法:
local a = {} local static_template = {z = 'Static'} function a.new(x, y) local new_table = {x = x, y = y} -- 复制静态属性 for k, v in pairs(static_template) do new_table[k] = v end return new_table end
验证效果
修改后运行b.lua,可以添加打印代码验证:
a = require 'a' d = {} table.insert(d, a.new(1, 2)) table.insert(d, a.new(2, 3)) for i, tbl in ipairs(d) do print(i, tbl.x, tbl.y, tbl) end
输出会显示两个不同的表内存地址,以及各自独立的(1,2)和(2,3)值,不会再出现覆盖问题。
内容的提问来源于stack exchange,提问作者niju
相关产品推荐
相关产品推荐

