2

我认为运行这段代码你会得到我的意思。我想将 5 个名字注册到一个寄存器()。我循环了 5 次,在每个循环中我都有一个变量newPerson,它应该保存有关一个人的所有信息,然后添加到人员寄存器中。在这个例子中,为了简单起见,只注册了人的名字。问题是最终所有人都变成了同一个名字:“Petra”。我对此有点玩弄,但无法为这种行为找到合理的理由。帮助表示赞赏!

local people={}
local person={
    name="Johan",
    lastName="Seferidis",
    class="B"
}
local names={"Markus", "Eva", "Nikol", "Adam", "Petra"} --people to register


for i=1, 5 do --register 5 people
    local newPerson=person
    local name=names[i]
    for field=1, 3 do --for each field(name, lastname, class)
        if field==1 then newPerson["name"]=name end --register name
    end
    people[i]=newPerson
end

print("First person name: " ..people[1]["name"])
print("Second person name: "..people[2]["name"])
print("Third person name: " ..people[3]["name"])
4

3 回答 3

6

这里最重要的是 Lua 中“包含”表的变量实际上只包含对表的引用。复制包含表的变量只会复制对该表的引用,因此表示与此示例中相同的表:

a={"x","y","z"}
b=a
b[2]="Q"
print(a[2]) -- returns Q and not y. Why is easily seen by doing:
print(a,b) -- returns table: 0xXXXXXX 0xXXXXXX indicating it's the same table

如果你真的想要一份表格的副本,你需要求助于http://lua-users.org/wiki/CopyTable

于 2010-12-21T18:00:10.553 回答
2

试试这个:

local people={}
local names={"Markus", "Eva", "Nikol", "Adam", "Petra"} --people to register

for i=1, 5 do
    people[i]={
        name=names[i],
        lastName="Seferidis",
        class="B"
        }
end
于 2010-12-21T16:51:19.403 回答
1

看起来您正试图将其person用作原型对象new以下是对添加函数以促进对象原型设计的代码的一些更改。

object = {}
function object:new(o)
    -- use the table provided, or create a new table
    o = o or {}
    -- use this object as a prototype
    setmetatable(o, self)
    self.__index = self
    return o
end

local people={}
local person=object:new({name="Johan",lastName="Seferidis",class="B"})

local names={"Markus", "Eva", "Nikol", "Adam", "Petra"} --people to register

for i=1, 5 do --register 5 people
    local newPerson=person:new({["name"]=names[i]})
    people[i]=newPerson
end

print("First person name: " ..people[1].name.." "..people[1].lastName.." "..people[1].class)
-->First person name: Markus Seferidis B

print("Second person name: "..people[2].name.." "..people[2].lastName.." "..people[2].class)
-->Second person name: Eva Seferidis B

print("Third person name: " ..people[3].name.." "..people[3].lastName.." "..people[3].class)
-->Third person name: Nikol Seferidis B
于 2010-12-21T19:00:48.630 回答