感谢所有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
e.g。
x=Object:new{a=1, _b=2};print(x)
{:a 1}
答案 0 :(得分:6)
这是最简单的方法吗?
到目前为止,没有。最简单的方法是在metatable中添加__tostring
函数。
function MyClass:__tostring()
return "<MyClass: "..self.foo..">"
end
不会为每个对象的元表添加大小。
这不是一个问题。每个类只应存在一个元表。表中一个条目的内存使用量可以忽略不计。
覆盖tostring
既丑陋又有潜在危险:如果您(或其他人)正在使用其对象具有s
方法且具有副作用的库,该怎么办?