Следующий код должен напечатать «привет», однако он печатает расположение таблицы в памяти (например, «таблица: 052E67D0»). Пожалуйста, объясните, что мне здесь не хватает.
TestClass = {}
function TestClass:new(o)
o = o or {}
setmetatable(o, self)
self.__index = self
return o
end
function TestClass:__tostring()
return "hello"
end
local t = TestClass.new{}
print(t)
Вместо этого попытался сделать это:
TestClass = {}
function TestClass:new(o)
o = o or {}
setmetatable(o, self)
self.__index = self
self.__tostring = function() return "hello" end
return o
end
local t = TestClass.new{}
print(t)
который работал. Это кажется странным, потому что для меня self в конструкторе и TestClass: относятся к одной и той же таблице.





Ваш TestClass:new принимает два аргумента, и вы вызываете его только с одним при создании t.
Изменять:
local t = TestClass.new{}
к:
local t = TestClass:new{}
Благодаря этому self в этом вызове TestClass:new теперь ссылка на TestClass, а не на пустую таблицу, которая (скорее всего) предназначалась для нового экземпляра класса.
В случае сомнений обратитесь к Справочное руководство по Lua §3.4.10 или этот вопрос о стеке.