Новичок Луа, Массив - PullRequest
       0

Новичок Луа, Массив

0 голосов
/ 04 февраля 2019

Какова цель строки 2 в моем коде?

local table = {["First"] = 1, ["Second"] = 2, ["Third"] = 3}

for key, value in pairs(table) do
    print(key)
end

Результаты -------------

First
Second
Third

Какова цель строки, которая говорит "для ключа, значение в парах (таблица) сделать печать (ключ)? Мне было интересно, почему это важно.

1 Ответ

0 голосов
/ 05 февраля 2019

Как и другие предлагали в комментариях, вы действительно должны начать с чтения Программирование на 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...