2016-08-10 120 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

您有幾個選擇。

1)場函數作爲關閉了VAR:簡單,但需要改變你如何使用它

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)__index元方法,以避免明確的函數調用語法

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函數也是通過var關閉的。) 如果要通過t修改var,請參閱__newindex metamethod。

這兩種方法都使用閉包。閉包是一個函數,它涉及參數和正文之外的非全局變量。

+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

即使這有幫助,我想問別的。 我可以做這樣的事情: 局部變量= 10 本地表= {「VAR」} 現在,我可以以某種方式把這個字符串來調用實際上是可變的,或者是不可能的? – FICHEKK

+0

@FICHEKK如果我們知道你正在努力做什麼,那會很好,因爲你可能以錯誤的方式接近問題。通過'調試'操作可以獲得本地值,但它非常不雅觀。 – Oka

+0

嘿,我在編輯解釋,檢查出來。 – FICHEKK