lua表,最简单的方法来重载__tostring

时间:2016-02-10 23:07:28

标签: lua tostring metatable

感谢所有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}

1 个答案:

答案 0 :(得分:6)

  

这是最简单的方法吗?

到目前为止,没有。最简单的方法是在metatable中添加__tostring函数。

function MyClass:__tostring()
    return "<MyClass: "..self.foo..">"
end
  

不会为每个对象的元表添加大小。

这不是一个问题。每个类只应存在一个元表。表中一个条目的内存使用量可以忽略不计。

覆盖tostring既丑陋又有潜在危险:如果您(或其他人)正在使用其对象具有s方法且具有副作用的库,该怎么办?