感谢所有讨论如何自定义打印表的 Lua stackoverflow 人员。经过大量阅读,我发布以下内容并询问 Lua 大师......
- 这是最简单的方法吗?
- 是不是太简单了(即以某种我不理解的方式损坏)?
请注意以下事项:
- 允许不打印的私有字段(只需以“_”开头的名称)
- 不会增加
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
例如
x=Object:new{a=1, _b=2};print(x)
{:a 1}