Lua 5.3.5 неожиданное поведение table.insert - PullRequest
0 голосов
/ 08 сентября 2018

При использовании table.insert(...) вот так:

test ={}
table.insert(test, 1)
print(test[1]) -- 1

table.insert(test, 2)
print(test[1]) -- 1

Ожидаемый результат печати

1

1

Теперь, когда вы сделаете это:

local A = { b = {} }
local B = { c = { x=0 } }

function add(t, X)
  local temp = B
  temp.c = {x=X}
  table.insert(t.b, temp)
end

local a = A
add(a, 1)
print(a.b[1].c.x) -- 1

add(a, 2)
print(a.b[1].c.x) -- 2

Результат

1

2

Но не должно ли быть 1 и 1 тоже? Это мое ожидаемое поведение, так как я обращаюсь к первому элементу inner table b оба раза. Что мне здесь не хватает?

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

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

function init_A(B)
    local t = {}
    if not (B== nil) then
        t.b = B
    else
        t.b = {}
    end
    return t
end

function init_B(C)
    local t = {}
    if not (C== nil) then
        t.c = C
    else
        t.c = { x=0 }
    end
    return t
end

function add(t, X)
  local temp = init_B({x=X})
  table.insert(t.b, temp)
end

local a = init_A()
add(a, 1)
print(a.b[1].c.x) -- 1

add(a, 2)
print(a.b[1].c.x) -- 1
print(a.b[2].c.x) -- 2
0 голосов
/ 08 сентября 2018

Я не совсем понимаю, что вы пытаетесь сделать с вашим кодом, но вы получаете 2 вместо 1, что вы ожидаете, потому что первый и второй элементы указывают на одну и ту же таблицу, так что вы думаете, что изменения применяются только к второй элемент фактически применяется к обоим (из-за вашего local temp = B назначения, что делает B используемым в каждом из вставленных элементов).

Добавьте print(a.b[1] == a.b[2]) в конец вашего скрипта для подтверждения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...