You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何生成具有唯一内存地址的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 00:12:08