2017-09-09 8 views
1

私は問題があります テーブルの前にnにある既知のテーブルの値を変更する必要があります。このような 何か:ルアがnテーブルのテーブルの値を取得する

Box = { 
     {Name = "",Box = {{Name = "",Box = {{Name = "", Box = {{Name = "This must be change for the test",Box = {}}}}}}}} 
    } 

は、これを変更するには、私はこれをハードコーディングすることができます

Box[1].Box[1].Box[1].Box[1].Name = "Changed" 

しかし、これではありません、私はそれを好きな方法! このテーブルを動的に変更したいので、テーブルの値をテーブル'n'のメインテーブル'tbl'に変更することができます。

これを行う方法はありますか?

+0

'local t、n = _G、4; j = 1の場合、n do t = t.Box [1] end; t.Name = "Changed" ' –

+0

@EgorSkriptunoff、これで答えは十分です。私は測定しました;) –

+0

@PaulKulchenko - しかし、それは一行コメントにうまく収まります! :-) –

答えて

0

このような問題は、おそらくデザインの選択肢を再考する必要があります。そのテーブルをn個のテーブルに記述すると、フィールドboxが子ノードへの参照を保持するツリーグラフに似ています。

コメントには、そのツリーの動的パスにあるノードを変更する必要があります。

しかし、なぜ動的パスでノードを変更する必要があるのか​​によって、より強固なアプローチがあるかもしれません。

local index={} 
local add_new_box = function(name) 
    local box = new_box(name) 
    index[ box.unique_id] = box 
    return box 
end 
:あなたはたとえば、あなたのボックスは、常に自分のIDでアクセス可能なインデックステーブルを作成することができることで

local new_box 
do 
local box_count=0 
new_box = function(name) 
    box_count=box_count+1 
    local box = { 
    unique_id=box_count, 
    name=name, 
    box={} 
    } 
    return box 
end 
end 

:痛いことはありません一つは、その作成時に、あなたの箱の一意の識別子のそれぞれを与えることです

これが受け入れられない場合、ツリーのノードを常に検索して、一意の値を持つことが保証されているノードを見つけることができます。

しかし、事実です:すべてのテーブルは既に一意の識別子を持っています。 a = {}を実行すると、aに割り当てられるのはそのアドレスです。それとの唯一の違いは、unique_idです。 1)aはあまり読みやすいものではありません。 2)aがわかっている場合は、検索する必要はありません。

だから、あなたの問題を見て見てみると、自分自身に尋ねる:??? 「この必要性はどこから来るのか、なぜ私はなぜ私はbox自体の代わりunique_idを得ることができないインデックスのunique_id代わりにシーケンスを取得することはできませんか"

関連する問題