Как вы копируете таблицу Lua по значению? - PullRequest
54 голосов
/ 13 марта 2009

Недавно я написал немного кода на Lua, например:

local a = {}
for i = 1, n do
   local copy = a
   -- alter the values in the copy
end

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

Итак, вопрос в том, что я должен написать вместо copy = a, чтобы получить копию значений в a?

Ответы [ 15 ]

1 голос
/ 11 июня 2012

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

Все фрагменты, которые были показаны до сих пор, не в состоянии создать копию для таблицы, которая может иметь общие ключи или ключи с таблицами, поскольку те, которые будут оставлены, указывают на исходную таблицу. Это легко увидеть, если вы попытаетесь скопировать таблицу, созданную как: a = {}; a[a] = a. Об этом заботится функция deepcopy , на которую ссылается Джон, поэтому, если вам нужно создать реальную / полную копию, следует использовать deepcopy.

1 голос
/ 16 марта 2009

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

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

1 голос
/ 13 марта 2009

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

0 голосов
/ 03 октября 2016

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

local copyOfTable = json.decode( json.encode( sourceTable ) )

Я пишу код Lua для некоторой домашней автоматизации на домашнем центре Fibaro 2. Реализация Lua очень ограничена, и в ней нет центральной библиотеки функций, к которой вы можете обратиться. Каждая функция должна быть объявлена ​​в коде, чтобы обеспечить работоспособность кода, чтобы такие однострочные решения были такими благоприятными.

0 голосов
/ 22 июня 2015

Это может быть самый простой метод:

local data = {DIN1 = "Input(z)", DIN2 = "Input(y)", AINA1 = "Input(x)"}

function table.copy(mytable)  --mytable = the table you need to copy

    newtable = {}

    for k,v in pairs(mytable) do
        newtable[k] = v
    end
    return newtable
end

new_table = table.copy(data)  --copys the table "data"
...