2016-08-27 2 views
3

У меня возникают проблемы с тем, как Lua использует ссылки на дублирующие таблицы. Если у меня есть следующий код:Дублирующие таблицы в Lua

table = {} 
table.hello = "Hello" 

function MyFunction (myTable) 
     myTable.goodbye = "goodbye" 
     return myTable 
end 

table2 = MyFunction(table) 

В этом коде таблица2 и таблица будут иметь одинаковое содержимое. Как я мог сделать так, чтобы только таблица2 имела перемену прощания?

+0

«Lua использует ссылки на дубликаты таблиц»: поскольку я думаю, вы понимаете, что переменная Lua ссылается на значение и назначение, return или параметр дублирует ссылку, а не значение. –

ответ

4

Вам нужно будет создать новую таблицу и скопировать все поля из старого в него:

function MyFunction (oldTable) 
    local newTable = {} 
    for k,v in pairs(oldTable) do 
     newTable[k] = v 
    end 
    newTable.goodbye = "goodbye" 
    return newTable 
end 

пример, я дал только делает неполную копию, так что если oldTable имеет поля, которые также являются изменяемыми таблицы, то они будут копироваться только по ссылке. Для получения дополнительной информации см. http://lua-users.org/wiki/CopyTable

2

Вы буквально должны скопировать стол.

Если это массив, поэтому содержит только цифры, как ключ, вы можете использовать классический цикл:

for i=1, #table do 
    table2[i] = table[i] 
end 

Но если вы используете текстовые ссылки, как в вашем примере с table.goodbye, вам нужно перебирать по пары ключ-значение:

for k,v in pairs(table) do 
    table2[k] = v 
end 

в обоих циклах table означает таблицу от который вы хотите скопировать, и table2 это один к, который вы вставляете.

+0

Примечание: пары повторяются по каждому ключу, а не только по строкам типа. –

+1

Также обратите внимание: 'для i = 1, #table do' выполняет итерации по положительным целым числам от 1 до« длины »таблицы, которая хорошо определена только тогда, когда [таблица имеет последовательность] (https: // www. lua.org/manual/5.3/manual.html#3.4.7) (возможно, это надмножество того, что вы подразумеваете под «является массивом», возможно, нет, потому что для меня массив просто означает ограниченный диапазон целых ключей с любыми значение, но последовательность не может включать значения nil). –

+0

@TomBlodget Я не собирался подразумевать; вместо этого я попытался сосредоточиться на этом простом для * не * итерации на * non * -integer ключах. Второй комментарий, с другой стороны, новый даже для меня, спасибо за просветление! –

Смежные вопросы