Назначение переменных в таблицы - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь присвоить переменную таблице, как показано ниже:

b = {x = 3, y = 4}

a = b
-- Reassigning by value?
a.x = 10
print(b.x,b.y)
--OUTPUT: 10 4

Однако я ожидал, что bx вообще не следует менять, поскольку я только изменил значениетопор, так что, похоже, я не совсем понимаю, что на самом деле делает «a = b» в этом примере

Извините, если это основной вопрос, любая помощь приветствуется!

1 Ответ

0 голосов
/ 11 декабря 2018

проблема в том, что a=b заставляет их указывать на одну и ту же таблицу, как видно из вывода repl ниже.

> c = {x = 10, y = 3}
> c
table: 0x564bbdb2d420
> b = c
> b
table: 0x564bbdb2d420
> c
table: 0x564bbdb2d420

Вам понадобится глубокая копия, такая какот этой сущности ):

function copy3(obj, seen)
  -- Handle non-tables and previously-seen tables.
  if type(obj) ~= 'table' then return obj end
  if seen and seen[obj] then return seen[obj] end

  -- New table; mark it as seen an copy recursively.
  local s = seen or {}
  local res = setmetatable({}, getmetatable(obj))
  s[obj] = res
  for k, v in pairs(obj) do res[copy3(k, s)] = copy3(v, s) end
  return res
end

, которая используется вот так a = copy3(b)

...