#lua
Вопрос:
я уже задавал этот вопрос на stackoverflow и принял ответ, я думаю, что на самом деле не понял ответа, и у меня появился еще один вопрос, мне неловко его задавать, поэтому я создаю новый вопрос
я изучаю lua и добрался до подходящей части, в этом примере
local tb = {}
local meta = {}
function tb.new(s)
local super = {}
super.s = s
setmetatable(super,meta)
return super
end
function tb.add(s1,s2)
return s1.s..s2.s
end
meta.__add = tb.add
f= tb.new("W")
t= tb.new("E")
print(f t)
когда компилятор доберется до f = tb.new("W")
я думаю, что это происходит
function tb.new("W") super.W = W return setmetatable(super,meta) return super end
так print(f t)
выглядит как
print(super super)
как это
tb.add(super,super)
найдите поля супер таблицы, используя
return s1.s..s2.s
также в качестве
tb.new
функция вызывается дважды и
setmetatable(super,meta)
происходит дважды. Есть ли какая-либо разница между первой и второй итерацией? если что-либо из вышеперечисленного неверно, пожалуйста, исправьте меня.
Ответ №1:
когда компилятор добирается до
f = tb.new("W")
, я думаю, что это происходитfunction tb.new("W") super.W = W return setmetatable(super,meta) return super end
Нет. Это больше похоже super['s'] = 'W'
на . Вот как работает точечная нотация. Я надеюсь, что это прояснит, как Lua «находит поля» позже.
поскольку
tb.new
функция вызывается дважды иsetmetatable(super,meta)
происходит дважды, есть ли какая-либо разница между первой и второй итерацией?
Они разные, потому super
что переменная каждый раз представляет собой новую таблицу. Каждый раз, когда вы видите {}
(конструктор таблиц), пустой или нет, он создает совершенно новую таблицу. meta
Однако это все та же таблица, потому что она получает конструктор таблицы только один раз, вне какой-либо функции.
Комментарии:
1. Спасибо за ответ. Поэтому ответ был настолько прост,; -; , я был под впечатлением, что
super.s = s
вотs=s
будут заменены на значения параметров, передаваемых в функцию, но только в значение rvalue, заменяется такreturn s1.s..s2.s
будет делатьreturn super.s..super.s
, как таблица будет уничтожен и воссоздан на 2-й вызов функции, таблицы с тем же идентификатором, и показатель может иметь различные значения, хранящегося как они оба изменились каким-то образом хоть каким способом . я думал, что много 2 достигнет этой точки, поэтому, если я ошибаюсь, пожалуйста, поправьте меня.2. Локальные переменные функции, включая ее параметры, могут ссылаться на разные значения при каждом ее вызове. Вот как
super
это относится к совершенно разным таблицам. Первая таблица на самом деле не уничтожается, потому что она возвращается и хранится внутриf
.