__tostring в пользовательских классах Lua - PullRequest
1 голос
/ 02 июля 2019

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

1 Ответ

1 голос
/ 02 июля 2019

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

Изменение:

local t = TestClass.new{}

на:

local t = TestClass:new{}

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

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

...