[英]lua tables, simplest way to overload __tostring
感谢所有讨论过如何自定义打印表的 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}
这是最简单的方法吗?
到目前为止,没有。 最简单的方法是将__tostring
函数添加到元表中。
function MyClass:__tostring()
return "<MyClass: "..self.foo..">"
end
不会为每个对象的元表增加大小。
这不是问题。 每个类应该只存在一个元表。 表中一个条目的内存使用可以忽略不计。
覆盖tostring
既丑陋又具有潜在危险:如果您(或其他人)使用的库的对象具有具有副作用的s
方法,该怎么办?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.