2013-07-09 3 views
0

В Lua я могу добавить запись внутри таблицы с table.insert(tableName, XYZ). Есть ли способ добавить уже существующую таблицу в таблицу? Я имею в виду прямой вызов, а не обход и добавление. ThanksПрисвоить таблицу таблице в Lua

+0

Вы имеете в виду добавить существующую таблицу по ссылке или по стоимости? Если по значению, которое подразумевало бы копирование содержимого из существующей таблицы в новую таблицу и вставка этого. Первый не требует какого-либо обхода при добавлении, поскольку копирование не выполняется. Это ты имел в виду? – greatwolf

ответ

2

Вставка в вашем примере будет работать нормально, если содержимое внутри XYZ-переменной (число, строка, таблица, функция и т. Д.) Будет работать нормально.

Это не скопирует таблицу, хотя в нее будет вставлена ​​фактическая таблица. Если вы хотите вставить копию таблицы, вам необходимо пройти ее и вставить содержимое.

2

Первое: В общем, вы делаете не необходимо table.insert для ввода новых записей в таблицы. Таблица в Lua представляет собой набор пар ключ-значение; Записи могут быть сделаны так:

local t = {} --the table 
local key= "name" 
local value = "Charlie" 

t[key] = value --make a new entry (replace an existing value at the same key!) 
print(t.name) --> "Charlie" 

Обратите внимание, что ключ может иметь любой типа (а не только целое число/строка)!

Очень часто вам понадобятся таблицы для простого частного случая: последовательность («список», «массив») значений. Для Lua это означает, что вам нужна таблица, где все ключи являются целыми целыми числами и содержат все значения, отличные от нуля. Функция table.insert предназначена для этого особого случая: Это позволяет вставить значение в определенном положении (или добавить его в конце последовательности, если не указано место):

local t = {"a", "b", "d"} --a sequence containing three strings (t[1] = "a", ...) 

table.insert(t, "e") --append "e" to the sequence 

table.insert(t, 3, "c") --insert "c" at index 3 (moving values at higher indices) 

--print the whole sequence 
for i=1,#t do 
    print(t[i]) 
end 
2

Если я понять, что вы имеете в виду правильно, вы хотите сделать это:

local t1 = {1, 2, 3} 
local t2 = {4, 5, 6} 
some_function(t1, t2) 
-- t1 is now {1, 2, 3, 4, 5, 6} 

Там действительно нет способа сделать это без перебора t2. Вот способ, чтобы написать some_function:

local some_function = function(t1, t2) 
    local n = #t1 
    for i=1,#t2 do t1[n+i] = t2[i] end 
end 
+0

Что делать, если исходный стол является иерархической таблицей? Я не знаю, как эта иерархия пойдет на –

1

Нет, вы должны скопировать пары ключ/значение второй таблицы в в первой таблице. Копирование существующих значений из второй таблицы - это то, что известно как «мелкая копия». Первая таблица будет ссылаться на те же объекты, что и на вторую таблицу.

Это работает при определенных обстоятельствах:

local n = #t1 
for i=1,#t2 do t1[n+i] = t2[i] end 

Это попытка переложить t2 элементы только за рамки существующих t1 элементов. Это может быть жизненно важным требованием, но не было указано в вопросе.

Он имеет несколько проблем, хотя:

  • Используя #t1 и #t2, он пропускает ключи, которые не являются положительными целыми числами и может пропустить ключи, целые числа больше, чем пропущенные целочисленный ключ (т.е. никогда назначен или назначен nil).
  • Он обращается к первой таблице с индексом, поэтому может вызвать метатет __newindex. То, что , вероятно, было бы нежелательным, если требуется только копирование.
  • Он обращается ко второй таблице с помощью индексатора, поэтому может ссылаться на метаметод __index.Это нежелательно, если требуется только копирование.

Можно подумать, что ipairs может быть использован, если только положительные целые ключи хотели, но он выходит на первое nil найденного значения так может пропустить даже больше, чем #t2 делает.

pairs Используйте вместо этого:

for key, value in pairs(t2) do 
    rawset(t1, key, value) 
end 

Если вы хотите, чтобы избежать замены существующих t1 значения, когда совпадают ключи или иначе карта t2 ключи каким-то образом то, что должно быть определено в требованиях.

Итог: pairs - это способ получить все ключи. Он эффективно делает rawget, поэтому он избегает вызова __index. rawset - это способ сделать копию без вызова __newindex.

+0

благодаря Тому. Что, если исходный стол является иерархической таблицей (таблица внутри таблицы)? Я не знаю, сколько уровней иерархии будет существовать. будет выше будет работать в этом? –

+0

Каждый ключ таблицы содержит ссылку на значение. Значение может быть любым (кроме «nil», и в этом случае ключ удаляется), включая таблицу. Таким образом, при копировании значения это ссылка на значение, которое копируется. Если значение относится к внутренней таблице, копия будет ссылаться на ту же внутреннюю таблицу. Это то же самое, что вы делаете с 'table.insert'. Если все в порядке, тогда все готово. Если вам нужна «глубокая копия», а не «мелкая копия», скажите так в вопросе и почему. Также см. [Здесь] (http://lua-users.org/wiki/CopyTable). –

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