2016-08-10 15 views
2

テーブルの要素を変更するにはどうすればよいですか?テーブルの変数を変更する

local table = {} 
local var = 10 

は、今私はtableの要素としてこの変数を挿入したいです。このような 何か:

table[1] = var 

私は必要なものは、私はこのtable[1]を呼び出すたび、ある、でも変数変更された場合、それはこのように、その変数の実際の値を呼び出します。

print(table[1]) -> prints 10 
var = var + 5 
print(table[1]) -> prints 15 

ですこれは何とか可能ですか?

編集: 私が達成したいことは、次のとおりです。テーブルにどの変数を表示するかを示す要素が必要です。たとえば、次のように

local var1 = 10 
local var2 = 20 

今、私はそうのようなこれらの変数の文字列などの要素があるテーブルがある場合:

local table = {"var1", "var2"} 

私はprint(table[1])をすれば今、もちろんそれは「VAR1」を出力しますが、実際にその変数が必要なときに、stringというテーブルのこの要素を変数に呼び出すことができます。あなたはなぜちょうどvar1と呼ぶのではないかと尋ねているかもしれませんが、説明できる理由がありますが、それは本当に長くなるでしょう。私はちょうどこのように必要と言いましょう。また、var1/var2CAN CHANGEです。

答えて

4

あなたにはいくつかの選択肢があります。 VARを超える閉鎖など

1)フィールド機能:わかりやすいが、あなたは

local t = {} 
local var = 10 
t.varf = function() return var end -- varf could be named var but that might be confusing 

var = var + 5 
print(t.varf()) -- call it to get the value 

2にそれを使用する方法の変更が必要)明示的な関数呼び出しの構文

local t = {} 
local var = 10 
setmetatable(t, { 
    __index = function(_, k) 
     if k=="var" then return var else return nil 
    end}) 

var = var + 5 
print(t.var) -- t does not contain a field with key "var" so __index is called 

(__indexを回避するために__indexのメタメソッド関数はvar上のクロージャでもあります) varからtを変更する場合は、__newindexメタメソッドを参照してください。

どちらの方法もクロージャを使用します。クロージャは、そのパラメータとボディの外側にある非グローバル変数を参照する関数です。

+0

私は実際に1)のソリューションが好きです。ありがとうございました。 – FICHEKK

2

Luaの番号は、割り当て時にコピーで共有されます。 table[1]およびvarには、それぞれ番号10の独自の独立したコピーが送信されます。

数値を共有する場合は、数値をそれぞれの表にカプセル化する必要があります。

local table = {} 
local var = { value = 10 } 

table[1] = var 

print(table[1].value) -- prints 10 
var.value = var.value + 5 
print(table[1].value) -- prints 15 

数字の上に何らかの抽象化を作成することも考えられます。簡単な例。あなたは、あなたの操作が明確に定義されていることを確認する必要があります。

local number = {} 
number.__index = number 

local function Number (value) 
    return setmetatable({ value = value }, number) 
end 

function number.__add (a, b) 
    if type(b) == 'number' then 
     return Number(a.value + b) 
    elseif getmetatable(b) == number then 
     return Number(a.value + b.value) 
    end 

    error("one of `number, Number' expected") 
end 

function number:add (n) 
    if type(n) == 'number' then 
     self.value = self.value + n 
    elseif getmetatable(n) == number then 
     self.value = self.value + n.value 
    else 
     error("one of `number, Number' expected") 
    end 

    return self.value 
end 

function number.__tostring (v) 
    return v.value .. '' 
end 



local foo = {} 
local bar = Number(10) 
foo[1] = bar 

print(foo[1]) -- 10 
bar:add(5) 
print(foo[1]) -- 15 
print(bar + 25) -- 40 
+0

でも、これは役に立ちます。私は何か他に尋ねたいと思います。= ローカルVAR 10 ローカルテーブル= {「VAR」} さて、私は何とか実際に変数を呼び出すために、この文字列を回すことができるのか、ということは不可能です: 私はこのような何かを行うことができますか? – FICHEKK

+0

@FICHEKKあなたが間違った方法で問題に近づいている可能性が高いので、あなたが何をしようとしているのかが分かっていれば、うれしいでしょう。 'debug'演算によってローカル値を得ることは可能ですが、それは非常に控えめです。 – Oka

+0

私はEDITの下で説明しました。 – FICHEKK

関連する問題