2

このコードを実行すると、私の言いたいことが正確に得られると思います。レジスター( people )に5人の名前を登録したい。私は 5 回ループし、各ループには変数newPersonがあります。これは、人に関するすべての情報を保存してから、登録に追加することになっています。この例では、簡単にするために人々の名前のみが登録されています。問題は、最終的にすべての人が「ペトラ」という同じ名前を持つようになることです。私はこれで少し遊んでいましたが、この動作の合理的な理由を得ることができません. 助けてください!

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 に答える