0

テーブルを別のテーブルにポイントする方法はありますか? 例えば:

local a = {}
local b = {}
a.name = "Josh"
print(a.name) -- Prints 'Josh'
print(b.name) -- Prints 'Josh' aswell
a.name = "I don't have a name"
print(a.name) -- Print 'I don't have a name'
print(b.name) -- Prints 'I don't have a name' aswell

あなたが私の主張を理解してくれることを願っています..ありがとう

編集:

さて、ここにアイデアがあります:

このような動的関数を作成しています

local table = { 1, 2, "hey" }

function drawimage(name, posx, posy referencetable)
    _tabledata[name] = { posx = posx, posy = posy, reference = {}}
    setmetatable(_tabledata[name].reference, { __index = referencetable })
end

drawimage("Header", 0, 50, table)

すべてうまくいき、値は機能し、私たちは皆幸せです..参照テーブルがこのように値を変更すると問題が発生します

local data = { 123123, 545454, "heyou" } -- Data is sent from another script via a trigger
table = data

インデックスで更新していないため (つまり、テーブル [1] = 9999) 参照変数は実際の変数と「同期されていません」。理解していただければ幸いです :)

EDIT2:

さて、ここに私の主な問題の自己動作例があります

local maintable = { "Stack", "Overflow" }
local maintablecopy = {}

maintablecopy = maintable

print("maintable[1] = " ..maintable[1]) -- Prints Stack
print("maintable[2] = " ..maintable[2]) -- Prints Overflow
print("")
print("maintablecopy[1] = " ..maintablecopy[1]) -- Prints Stack
print("maintablecopy[2] = " ..maintablecopy[2]) -- Prints Overflow
print("")

print("Changing values..")
local newdata = { "Hello", "World" }
maintable = newdata

print("")
print("maintable[1] = " ..maintable[1]) -- Prints Hello
print("maintable[2] = " ..maintable[2]) -- Prints World
print("")
print("maintablecopy[1] = " ..maintablecopy[1]) -- Prints Stack    -- PROBLEM
print("maintablecopy[2] = " ..maintablecopy[2]) -- Prints Overflow -- PROBLEM

print("Using setmetatable..")

maintable = { "Stack", "Overflow" }
maintablecopy = {}
setmetatable(maintablecopy, { __index = maintable })

print("maintable[1] = " ..maintable[1]) -- Prints Stack
print("maintable[2] = " ..maintable[2]) -- Prints Overflow
print("")
print("maintablecopy[1] = " ..maintablecopy[1]) -- Prints Stack
print("maintablecopy[2] = " ..maintablecopy[2]) -- Prints Overflow
print("")

print("Changing values..")
local newdata = { "Hello", "World" }
maintable = newdata

print("")
print("maintable[1] = " ..maintable[1]) -- Prints Hello
print("maintable[2] = " ..maintable[2]) -- Prints World
print("")
print("maintablecopy[1] = " ..maintablecopy[1]) -- Prints Stack    -- PROBLEM
print("maintablecopy[2] = " ..maintablecopy[2]) -- Prints Overflow -- PROBLEM

変数が更新されたときにテーブルを直接指すことができないのはなぜですか? 更新するテーブルが20あるので、これを行う方が簡単です

local _dynamics = {}

local tbl1 = { "Hey", 8787 } 
local tbl2 = { 123, "There" }
local tbl3 = { "You", 1111 }  

function dynamicFunction(name, posx, posy, textsize, reference)
    _dynamics[name] = { posx = posx, posy = posy, textsize = textsize, reference = reference }
end

dynamicFunction("first", 0, 0, 5, tbl1)
dynamicFunction("second", 0, 0, 5, tbl2)
dynamicFunction("third", 0, 0, 5, tbl3)

for key in pairs(_dynamics) do
    local inf = _dynamics[key]
    for i = 1, #inf.reference do
        print(inf.reference[i])
        if i == #inf.reference then
            print("")
        end
    end
end

print("")
print("")

tbl1 = { "aaaaa", "bbbbbbbbbb" }
tbl2 = { "ccccccccccc", "ttttttttttt" }
tbl3 = { "rrrrrrr", "yyyyyyyyyyy" }

for key in pairs(_dynamics) do
    local inf = _dynamics[key]
    for i = 1, #inf.reference do
        print(inf.reference[i])
        if i == #inf.reference then
            print("")
        end
    end
end

print("Values should get updated on the reference variable, but it doesn't.. this would save me     to do a check for every single variable")

http://www.compileonline.com/execute_lua_online.phpで実行して、私の言いたいことを確認してください。

ぐちゃぐちゃで申し訳ありませんが、私の英語は最高ではありません:D

4

1 に答える 1

2

あなたは__indexメタメソッドが欲しい:

local a = { name="Josh" }
local b = {}

print(a.name) --> Josh
print(b.name) --> nil

setmetatable(b,{__index=a})
print(b.name) --> Josh

a.name = "Gilligan"
print(a.name) --> Gilligan
print(b.name) --> Gilligan

-- but note! the shadow
b.name = "overridden"
print(a.name) --> Gilligan
print(b.name) --> overridden

b.name = nil
print(a.name) --> Gilligan
print(b.name) --> Gilligan

詳細については、私のこの記事を提供します:
http://phrogz.net/lua/LearningLua_ValuesAndMetatables.html


Edit2 への応答:

あなたのコードのいくつかの問題を要約しましょう:

local maintablecopy = {}
maintablecopy = maintable

上記のコードでは、1 つのテーブルを作成し、そのテーブルを参照するように設定し、代わりに別のテーブルを参照するように設定するmaintablecopyと、そのテーブルは完全に破棄されます。maintablecopyこれは、変数がどのように機能するかを理解していないことを示しています。

local newdata = { "Hello", "World" }
maintable = newdata

繰り返しますが、に「コピー」newdataしているのではなくmaintable、ここで同じテーブルを参照するように変数を変更しています。

maintable = { "Stack", "Overflow" }
maintablecopy = {}
setmetatable(maintablecopy, { __index = maintable })

-- …

local newdata = { "Hello", "World" }
maintable = newdata

繰り返しますが、同じ問題です。コードを変更するには、次の方法があります。

テーブルの内容を置き換える

代わりにmaintable = newdataこれを行うことができます:

function copytable(from,to_table)
  -- erase all old keys
  for k,_ in pairs(to_table) do to_table[k] = nil end

  -- copy the new ones over
  for k,v in pairs(from) do to_table[k] = v end
end

local a = { name="Foo" }
local b = {}
copytable(a,b)
print(a.name == b.name) --> true

local c = { name="NEW" }
copytable(c,b)
print(c.name == b.name) --> true

ただし、これを行っても、変更があったb場合は更新されませんc

c.name = "EVEN NEWER"
print(c.name == b.name) --> false

__index を更新する

local a = { name="Foo" }
local b = setmetatable({},{__index=a})
print(a.name == b.name) --> true

-- cause b to follow c now instead of a
local c = { name="NEW" }
getmetatable(b).__index = c
print(c.name == b.name) --> true

c.name = "EVEN NEWER"
print(c.name == b.name) --> true

一般に、このXY 問題ではなく、一歩下がって、解決しようとしている元の問題を説明する必要があります。

于 2014-11-23T04:09:41.297 に答える