lua: 如何在 __tostring 元方法中获取原始字符串?

代码如下:

local t = {}
setmetatable(t, {__tostring = function(self) return 'MyTable is: '..tostring(self) end})
print(t)

运行代码会导致错误:“C stack overflow”。因为在 __tostring 元方法中,tostring(self) 将调用 __tostring 元方法,导致死循环。

有没有一种方法可以获得值“t”的原始字符串?

点赞
用户734069
用户734069

为了在 Lua 中实现你正在尝试的操作,你需要解除主表的元表,然后对其调用 tostring,再重新设置元表。示例如下:

setmetatable(t, {
  __tostring = function(self)
    local temp = getmetatable(self)
    setmetatable(self, nil)
    local ret = 'MyTable is: ' .. tostring(self)
    setmetatable(self, temp)
    return ret
  end,
})

此外,需要注意 __tostring 元方法应该 返回 字符串,而不是仅仅打印它。

2018-08-27 03:55:14