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

ли это даже возможно как-то?

EDIT: Я хочу выполнить следующее: я хочу иметь элемент в таблице, в котором указывается, какая переменная должна отображаться. Например:

local var1 = 10 
local var2 = 20 

Теперь, если у меня есть таблица, которая имеет элементы как строки из этих переменных, как так:

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

Теперь, если я print(table[1]), конечно, печатает «var1», но есть ли способ превратить этот элемент таблицы в string в вызов переменной, когда мне действительно нужна эта переменная. Вы можете спросить, почему бы мне просто не позвонить var1, но есть причина, которую я могу объяснить, но это было бы очень долго. Скажем, мне просто нужно это так. Кроме того, var1/var2CAN CHANGE.

ответ

4

У вас есть несколько вариантов.

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) __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.) Если вы хотите изменить var через t, то посмотрите на metamethod __newindex.

Оба метода используют затворы. Закрытие - это функция, которая ссылается на неглобальные переменные за пределами ее параметров и тела.

+0

Мне очень нравится 1) решение. Спасибо. – FICHEKK

2

Количество номеров в городе Луа: копия, во время отправки. 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 локальной таблицы = { «вара»} Теперь, я могу как-то превратить эту строку для вызова на самом деле переменными, или в том, что невозможно? – FICHEKK

+0

@FICHEKK Было бы хорошо, если бы мы знали, что вы пытаетесь сделать точно, потому что вы, вероятно, приближаетесь к проблеме не так. Можно получить локальные значения через операции 'debug', но это очень неэлегантно. – Oka

+0

Эй, ребята, я объяснил в разделе EDIT, проверьте это. – FICHEKK

Смежные вопросы