В чем разница пар () и ipairs () в Lua? - PullRequest
6 голосов
/ 11 марта 2019

В чем цикл for, в чем разница между циклом с pair () и ipairs ()? Эта страница использует оба: Lua Docs

с ipairs ():

a = {"one", "two", "three"}
for i, v in ipairs(a) do
  print(i, v)
end

Результат:

1   one
2   two
3   three

с парами ():

a = {"one", "two", "three"}
for i, v in pairs(a) do
  print(i, v)
end

Результат:

1   one
2   two
3   three

Вы можете проверить это здесь: Lua Demo

Ответы [ 2 ]

10 голосов
/ 11 марта 2019

pairs() и ipairs() немного отличаются.

  • pairs() возвращает пары ключ-значение и в основном используется для ассоциативных таблиц.Порядок ключей не указан.
  • ipairs() возвращает пары индекс-значение и в основном используется для числовых таблиц.Нечисловые ключи в массиве игнорируются, а порядок индексов является детерминированным (в числовом порядке).

Это иллюстрируется следующим фрагментом кода.

> u={}
> u[1]="a"
> u[3]="b"
> u[2]="c"
> u[4]="d"
> u["hello"]="world"
> for key,value in ipairs(u) do print(key,value) end
1   a
2   c
3   b
4   d
> for key,value in pairs(u) do print(key,value) end
1   a
hello   world
3   b
2   c
4   d
> 

Когда высоздать таблицы без ключей (как в вашем вопросе), он ведет себя как числовой массив и поведение или пары и пары идентичны.

a = {"one", "two", "three"}

эквивалентно a[1]="one" a[2]="two" a[3]="three" и pairs() и ipairs() будут идентичны (за исключением порядка, который не гарантируется в pairs()).

1 голос
/ 11 марта 2019

В Lua нет array -типа, только table s, которые могут иметь последовательные элементы, начиная с индекса 1.

Общий цикл for, в отличие от числового цикла for,ожидает три значения:

  1. вызываемое
  2. значение контекста, которое оно передает
  3. начальное значение индекса

это вызоввызываемый с context-value и index-value, сохраняющий все возвращаемые значения в предоставленных новых переменных.Первый дополнительно сохраняется как новое значение индекса.

Теперь некоторые репрезентативные примеры вызовов для цикла:

  1. ipairs(t) возвращает функцию, таблицуt и начальная точка 0.
    Функция является моральным эквивалентом:

    function ipairs_next(t, i)
        i = i + 1
        var v = t[i]
        if v ~= nil then
            return i, v
        end
    end
    

    Таким образом, отображаются все числовые записи, начиная с 1 до первого пропущенного.

  2. pairs(t) либо делегирует метатаблицу t, в частности __pairs(t), либо возвращает функцию next, таблицу t и начальную точку nil.next принимает таблицу и индекс и возвращает следующий индекс и соответствующее значение, если оно существует.

    Таким образом, все элементы отображаются в произвольном порядке.

  3. Нет пределов тому, насколько творческим можно быть с помощью функции, и именно этого ожидает ванильный Lua.
    См. " Bizzare" попытка вызвать табличное значение "в Lua "для примера написанного пользователем вызываемого и того, как реагируют некоторые диалекты, если первое значение на самом деле не является вызываемым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...