__tostring в пользовательских классах Lua

Следующий код должен напечатать «привет», однако он печатает расположение таблицы в памяти (например, «таблица: 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: относятся к одной и той же таблице.


person Anton Curmanschii    schedule 02.07.2019    source источник


Ответы (1)


Ваш TestClass:new принимает два аргумента, и вы вызываете его только с одним при создании t.

Изменять:

local t = TestClass.new{}

to:

local t = TestClass:new{}

Благодаря тому, что self в этом вызове TestClass:new теперь является ссылкой на TestClass, а не на пустую таблицу, которая (скорее всего) предназначалась для нового экземпляра класса.

В случае сомнений обратитесь к Справочному руководству по Lua, §3.4.10 или этот вопрос stackoverflow.

person Green    schedule 02.07.2019