Унаследованные объекты имеют один и тот же атрибут таблицы в Lua - PullRequest
0 голосов
/ 20 апреля 2019

Я хочу построить простую иерархию наследования в Lua. У BaseClass есть два атрибута: одно значение val и таблица vals. Если я создаю два объекта foo и bar из SubClass и изменяю эти два атрибута, изменения val работают, как и ожидалось, но для vals кажется, что оба объекта совместно используют одну и ту же таблицу внутри.

BaseClass = {}

function BaseClass:new()
    o = {}
    setmetatable(o, self)
    self.__index = self
    o.val = 0
    o.vals = {}
    return o
end

SubClass = BaseClass:new()

function SubClass:new()
    o = {}  
    setmetatable(o, self)
    self.__index = self
    return o
end

foo = SubClass:new()
bar = SubClass:new()
foo.val = 1
bar.val = 2
foo.vals[#foo.vals + 1] = 1
bar.vals[#bar.vals + 1] = 2
print(foo.val, bar.val)
print(#foo.vals, #bar.vals)

Код печатает

1 2
2 2

Как я могу решить это? Как создать две разные таблицы для foo и bar?

1 Ответ

1 голос
/ 21 апреля 2019

Ваш метод new не различает подклассы и экземпляры. (Я не знаю, почему Программирование на Lua делает это так.) Один из способов решить эту проблему - использовать отдельный метод для создания подклассов:

BaseClass = {}
BaseClass.__index = BaseClass

function BaseClass:new()
    o = {}
    setmetatable(o, self)
    o.val = 0
    o.vals = {}
    return o
end

function BaseClass:subclass()
  local c = {}
  setmetatable(c, self)
  c.__index = c
  return c
end

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