gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:22:46 28 4
gpt4 key购买 nike

感谢所有讨论如何自定义打印表的 Lua stackoverflow 人员。经过大量阅读,我发布以下内容并询问 Lua 大师......

  • 这是最简单的方法吗?
  • 是不是太简单了(即以某种我不理解的方式损坏)?

  • 请注意以下事项:
  • 允许不打印的私有(private)字段(名称以“_”开头)
  • 不会将大小添加到 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}

    最佳答案

    is this the simplest way?



    到目前为止,没有。最简单的方法是添加 __tostring对您的元表起作用。
    function MyClass:__tostring()
    return "<MyClass: "..self.foo..">"
    end

    does not add size to the metatable of every object.



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

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

    关于lua 表,重载 __tostring 的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35327781/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com