Можно ли обойти __tostring так, как rawget/set обходит __index/__newindex в Lua?

Например:

local my_table = { name = "my table" }
local my_table_mt = {}

function my_table_mt.__tostring(tbl)
    return "%s<%s>":format(tbl.name or "?", rawtostring(tbl))
end

Возможно ли что-то подобное? Я знаю, что метода rawtostring не существует, но есть ли способ эмулировать это поведение или вообще обойти его?


person Llamageddon    schedule 07.04.2017    source источник


Ответы (1)


Есть только этот ляп:

function rawtostring(t)
   local m=getmetatable(t)
   local f=m.__tostring
   m.__tostring=nil
   local s=tostring(t)
   m.__tostring=f
   return s
end
person lhf    schedule 07.04.2017
comment
При работе с кодом, который использует __metatable для скрытия истинной метатаблицы, не забудьте использовать debug.getmetatable вместо простого getmetatable. (Если __metatable мешает, и вы не можете использовать модуль debug — например, в ограниченной среде — вам не повезло.) - person nobody; 08.04.2017
comment
Этот код полностью безопасен в Lua. Lua не является потокобезопасным, если вы не создадите глобальную блокировку. Используйте разные состояния Lua в разных потоках ОС - person lhf; 08.04.2017