Graff46
@Graff46
Программист любитель

"Срез" вложенной таблицы на определённом уровне «башни» из таблиц множественно вложенных в глубину (сами в себя)?

Подскажите почему при построении "башни" из таблиц (без явных ключей) в глубину, "срезать" таблицу на определённом уровне можно так: (не забываем про теорию - в луа переменные содержат ссылки на таблицы, а не копии таблиц!)
local t = {{{{{}}}}} -- 4 вложенных
local g = t
local tst = t[1][1][1]

print(t[1][1][1][1]) -- table:
t[1][1] = t[1][1][1]
print(t[1][1] ==  tst, t[1][1][1][1] ) -- true, nil срезалась и "хвост" подтянула!
-- А так нельзя
print( t[1][1][1][1] ) -- table:
local a = t[1][1]
local b = t[1][1][1]
a = b
print( t[1][1][1][1] ) -- table: хвост не подтянут!
print( t[1][1] == g[1][1],  t[1][1]== tst) -- true, false
-- и срез не произошёл! Проверим ещ переменные:
print( a == g[1][1], b == g[1][1], a==b) -- false, false, true
print(a == g[1][1][1], b == g[1][1[1]]) -- true, true

print(a == t[1][1][1], b == t[1][1[1]]) -- true, true
print(t==g) -- true

Как можно программно реализовать правильный срез таблицы из "башни", если вложенную таблицу на определённом уровне я получаю циклом:
local pred = t
while (pred) do
    pred = pred[1]
   if pred == t[1][1] then
        pred = pred[1] -- не работает так. см 2 пример
   end
end
  • Вопрос задан
  • 136 просмотров
Решения вопроса 1
dollar
@dollar Куратор тега Lua
Делай добро и бросай его в воду.
Так нельзя
local a = t[1][1]
local b = t[1][1][1]
a = b

Потому что a - это просто переменная. Вы ей присваиваете новое значение, пусть даже ссылку, но это никак не затрагивает другие переменные с другими именами.

Но можно сделать, например, так:
local a = t[1]
local b = t[1][1][1]
a[1] = b

Потому что здесь мы уже не трогаем переменную a, а работаем с тем, на что она указывает, т.е. t[1], т.е. это аналог t[1][1] = b

Отвечая на вопрос, вам нужно не только знать вложенную таблицу на определенном уровне, но и таблицу на 1 уровень выше (т.е. предка).
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы