Благодаря всем пользователям Lua stackoverflow, которые обсудили, как настроить таблицы печати. После долгих чтений я публикую следующее и задаю гуру Lua ....lua tables, самый простой способ перегрузить __tostring
- это самый простой способ?
- это слишком просто (т. Е. Сломанный каким-то образом я не понимаю)?
Обратите внимание, что следующий:
- позволяет для частных полеев (просто начать свое имя с «_»), которые не должны быть напечатаны
- не добавляет размера к
metatable
каждому объекту ,
Мой подход переписывает метод по умолчанию tostring
.
_tostring = _tostring or tostring
function tostring(t)
if type(t) == "table" then
status, stuff = pcall(function() return t:s() end)
if status then
return stuff
end end
return _tostring(t)
end
выше немного зла (что призыв к PCALL ... не мое гордое немного кода, но, хе, это работает).
В любом случае, теперь tostring
делает вызов метода t:s()
к объекту, который мы можем определить с помощью следующей доморощенного системы объекта:
Object={}
function Object:new(o)
o = o or {}
setmetatable(o,self)
self.__index = self
return o
end
Вот определение по умолчанию :s()
- которые могут быть настроены в суб -классов.
function Object:s()
-- can be customized in subclasses
local out,sep="{",":"
for x,y in pairs(self) do
if string.sub(x,1,1) ~= "_" then
out = out..sep..x.." "..y
sep = " :"
end end
return out .. '}'
end
e.g.
x=Object:new{a=1, _b=2};print(x)
{:a 1}
Зачем переписывать tostring вместо настройки метаданных __tostring? – warspyking
Я голосую, чтобы закрыть этот вопрос как не по теме, потому что он показывает рабочую оду, а ОП просит [codereview.se]. – hjpotter92
@ hjpotter92 _working code_ не является допустимой причиной непогоды для переполнения стека. Он просит об улучшении конкретной проблемы/проблемы. Что-то не в тему о просмотре кода в любом случае – Quill