2010-12-21 252 views
1

我認爲運行這個代碼你會得到我的意思。我想註冊5個名字到一個註冊()。我循環5次,並在每個循環中我有一個變量newPerson這應該保存所有關於一個人的信息,然後被添加到註冊。在這個例子中,爲了簡單起見,只有人的姓名正在註冊。 問題是,最後所有人都轉向具有相同的名稱:「佩特拉」。我玩了一下這個,但不能得到這種行爲的合理理由。幫助讚賞!Lua:爲什麼改變一個變量的值也會改變另一個變量的值呢?

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"]) 

回答

5

最重要的事情在這裏一方面是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

+0

謝謝!這解釋了很多。 – Pithikos 2010-12-21 18:37:37

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 
1

它看起來像你試圖使用person作爲prototype object。以下是代碼的一些更改,其中添加了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 
相關問題