Вы можете jest.mock
Keyframes
. Я не уверен, откуда вы импортируете его, но если вы смоделируете все до функции загрузки и передадите шпионскую функцию next
, вы можете подтвердить передачу цветов в next
.
Анимации сложно проверить, и тщательное тестирование потребует много насмешек. Это не могло быть для этого.
Я думаю причина, почему Lua не имеет 'table.copy ()' в его стандартных библиотеках, то, потому что задача не точна для определения. Как показано уже здесь, можно или сделать копию "одним уровнем глубоко" (который Вы сделали), deepcopy с или не заботясь о возможных дублирующихся ссылках. И затем существуют таблицы метаданных.
Лично, я все еще хотел бы, чтобы они предложили встроенную функцию. Только если люди не радовались бы с его семантикой, они должны будут пойти, делают это сами. Не очень часто, тем не менее, у каждого на самом деле есть потребность копии значением.
Это так хорошо, как Вы доберетесь для основных таблиц. Используйте что-то как deepcopy, если необходимо скопировать таблицы с таблицами метаданных.
(К сожалению, слегка зарегистрированный) проект stdlib имеет много ценных расширений нескольких из библиотек, поставленных со стандартным распределением Lua. Среди них несколько вариаций на тему копирования таблицы и слияния.
Эта библиотека также включена в Lua для распределения Windows и должна, вероятно, быть частью любой серьезной панели инструментов пользователя Lua.
Одной вещью удостовериться в при реализации вещей как это вручную является правильное обращение таблиц метаданных. Для простых приложений таблицы поскольку структура у Вас, вероятно, нет таблиц метаданных, и простой цикл с помощью pairs()
является приемлемым ответом. Но если таблица используется в качестве дерева, или содержит циклические ссылки или имеет таблицы метаданных, то вещи становятся более сложными.
Вот то, что я на самом деле сделал:
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
Это обрабатывает таблицы и таблицы метаданных путем называния себя рекурсивно (, который является его собственным вознаграждением ). Один из умных битов - то, что можно передать его любое значение (ли таблица или не), и это будет скопировано правильно. Однако стоимость - то, что это могло потенциально переполнить стека. Так и еще больше устойчивое (нерекурсивный) функция могла бы быть необходима.
, Но это - излишество для очень простого случая желания скопировать массив в другую переменную.
Только, чтобы проиллюстрировать тезис, мое персональное 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
нет никакой функции копии, достаточно широко согласованной, чтобы быть названной "стандартной".
Копия таблицы имеет много потенциальных определений. Это зависит от того, хотите ли Вы простую или глубокую копию, хотите ли Вы скопировать, совместно использовать или проигнорировать таблицы метаданных, и т.д. нет никакой единственной реализации, которая могла удовлетворить всех.
Один подход должен просто составить новую таблицу и копировать все пары ключ/значение:
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
только, выполняет итерации по подмножеству ключей таблицы (т.е. последовательных положительных целочисленных ключей, запускающихся в одном в увеличивающемся порядке).