Как Вы копируете таблицу Lua значением?

Вы можете jest.mock Keyframes. Я не уверен, откуда вы импортируете его, но если вы смоделируете все до функции загрузки и передадите шпионскую функцию next, вы можете подтвердить передачу цветов в next.

Анимации сложно проверить, и тщательное тестирование потребует много насмешек. Это не могло быть для этого.

55
задан greatwolf 14 November 2013 в 22:25
поделиться

6 ответов

Я думаю причина, почему Lua не имеет 'table.copy ()' в его стандартных библиотеках, то, потому что задача не точна для определения. Как показано уже здесь, можно или сделать копию "одним уровнем глубоко" (который Вы сделали), deepcopy с или не заботясь о возможных дублирующихся ссылках. И затем существуют таблицы метаданных.

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

1
ответ дан akauppi 26 November 2019 в 17:46
поделиться

Это так хорошо, как Вы доберетесь для основных таблиц. Используйте что-то как deepcopy, если необходимо скопировать таблицы с таблицами метаданных.

1
ответ дан Aaron Saarela 26 November 2019 в 17:46
поделиться

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

Эта библиотека также включена в Lua для распределения Windows и должна, вероятно, быть частью любой серьезной панели инструментов пользователя Lua.

Одной вещью удостовериться в при реализации вещей как это вручную является правильное обращение таблиц метаданных. Для простых приложений таблицы поскольку структура у Вас, вероятно, нет таблиц метаданных, и простой цикл с помощью pairs() является приемлемым ответом. Но если таблица используется в качестве дерева, или содержит циклические ссылки или имеет таблицы метаданных, то вещи становятся более сложными.

4
ответ дан RBerteig 26 November 2019 в 17:46
поделиться

Вот то, что я на самом деле сделал:

for j,x in ipairs(a) do copy[j] = x end

Как упоминания Doub , если Ваши ключи таблицы строго монотонно не увеличиваются, это должно быть pairs не ipairs.

я также нашел deepcopy функция, которая более устойчива:

function deepcopy(orig)
    local orig_type = type(orig)
    local copy
    if orig_type == 'table' then
        copy = {}
        for orig_key, orig_value in next, orig, nil do
            copy[deepcopy(orig_key)] = deepcopy(orig_value)
        end
        setmetatable(copy, deepcopy(getmetatable(orig)))
    else -- number, string, boolean, etc
        copy = orig
    end
    return copy
end

Это обрабатывает таблицы и таблицы метаданных путем называния себя рекурсивно (, который является его собственным вознаграждением ). Один из умных битов - то, что можно передать его любое значение (ли таблица или не), и это будет скопировано правильно. Однако стоимость - то, что это могло потенциально переполнить стека. Так и еще больше устойчивое (нерекурсивный) функция могла бы быть необходима.

, Но это - излишество для очень простого случая желания скопировать массив в другую переменную.

6
ответ дан Community 26 November 2019 в 17:46
поделиться

Только, чтобы проиллюстрировать тезис, мое персональное table.copy также обращает внимание на таблицы метаданных:

function table.copy(t)
  local u = { }
  for k, v in pairs(t) do u[k] = v end
  return setmetatable(u, getmetatable(t))
end

нет никакой функции копии, достаточно широко согласованной, чтобы быть названной "стандартной".

30
ответ дан Norman Ramsey 26 November 2019 в 17:46
поделиться

Копия таблицы имеет много потенциальных определений. Это зависит от того, хотите ли Вы простую или глубокую копию, хотите ли Вы скопировать, совместно использовать или проигнорировать таблицы метаданных, и т.д. нет никакой единственной реализации, которая могла удовлетворить всех.

Один подход должен просто составить новую таблицу и копировать все пары ключ/значение:

function table.shallow_copy(t)
  local t2 = {}
  for k,v in pairs(t) do
    t2[k] = v
  end
  return t2
end

copy = table.shallow_copy(a)

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

43
ответ дан greatwolf 26 November 2019 в 17:46
поделиться