как функция перемещается по полям таблицы

#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 .