Вставка объекта в таблицу переопределяет других членов таблицы - PullRequest
2 голосов
/ 07 июня 2019

Мне нужно создать таблицу объектов в Lua.Но когда я вставляю объект в таблицу, все элементы, вставленные ранее, изменят значения.Хэш-код всех этих объектов отличается

Rectangle = {area = 0, length = 0, breadth = 0}
function Rectangle:new (o,length,breadth)
   o = o or {}
   setmetatable(o, self)
   self.__index = self
   self.length = length or 0
   self.breadth = breadth or 0
   self.area = length*breadth;
   return o
end

foo = {}
r1 = Rectangle:new(nil, 10, 10);
table.insert(foo,r1)

r2 = Rectangle:new(nil, 20, 20);
table.insert(foo, r2)

r3 = Rectangle:new(nil, 50, 50);
table.insert(foo, r3)

print(r1.length) -- 50, should be 10
print(r2.length) -- 50, should be 20
print(r3.length) -- 50 is 50

Как вставить объекты, не затрагивая другие элементы?Я искал в Интернете, и я думаю, что это исправлено в 5.2.Но мне нужно использовать 5.1.

Может кто-то помочь, спасибо

решено

Rectangle = {area = 0, length = 0, breadth = 0}
function Rectangle:new (o,length,breadth)
   o = o or {}
   o.length = length or 0
   o.breadth = breadth or 0
   o.area = length*breadth
   setmetatable(o, self)
   self.__index = self
   return o
end

1 Ответ

1 голос
/ 07 июня 2019

В Rectangle:new, до

   o.length = length or 0
   o.breadth = breadth or 0
   o.area = length*breadth

self будет содержать Rectangle при вызове Rectangle:new().

...