感谢所有讨论如何自定义打印表格的Lua stackoverflow用户。经过大量阅读,我发布以下内容并向Lua专家询问:
上面的代码有点邪恶(调用 pcall 的那部分……并不是我最引以为傲的代码,但是它能够工作)。
无论如何,现在 tostring 把方法调用 t:s() 转换为了一个我们可以使用以下自制对象系统定义的对象:
这是
例如。
- 这是最简单的方法吗?
- 它是否太简单(即以我不理解的某种方式损坏)?
请注意以下内容:
- 允许私有字段(只需以“_”开头命名),不会被打印出来
- 不会向每个对象的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}