Как и другие предлагали в комментариях, вы действительно должны начать с чтения Программирование на Lua .Это объяснит это и многое другое, и это действительно идеальное место для начала, если вы хотите выучить Lua.
Что ж, тогда что касается того, что он делает
Учитывая таблицу, подобную этой
local tab = {first = 1, second = 2, third = 3}
способ, которым вы обычно выполняете итерации по всем парам ключ-значение в таблице, выглядит следующим образом
for key, value in pairs(tab) do
print(key .. ": " .. tostring(value))
end
Это зациклит три значения в таблице first = 1
, second = 2
и т. д. Для каждой пары key
- это ключ таблицы, а value
- его значение.Затем он выполняет код между do
и end
с установленными переменными.
Таким образом, в приведенном выше примере будет напечатано следующее:
first: 1
second: 2
third: 3
Как это работает?
Это немного сложнее;Давайте сначала посмотрим, что на самом деле возвращает pairs
:
> t = {}
> print(pairs(t))
function: 68f18400 table: 0066b1d8 nil
Таблица, которую он возвращает в качестве второго аргумента, такая же, как мы передали.
Функция, возвращаемая pairs
- это функция next
, которая при наличии таблицы и ключа возвращает следующий ключ в таблице в неизвестном порядке, но без повторяющихся клавиш.
Вы можете легкоподтвердите это в командной строке.
> print(t)
table: 0066b1d8
> print(next)
function: 68f18400
Затем Lua превращает цикл for в нечто вроде следующего:
do
local f, state, iterator = next, tab, nil -- this is what's returned by pairs
while true do
local key, value = f(state, iterator)
if key == nil then break end
iterator = key
print(key, value) -- This is the body of our for loop
end
end