繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM