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

时间:2018-08-27 03:41:08

标签: lua

以下代码:

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

运行代码将导致错误:“ C堆栈溢出”。因为在__tostring元方法中,tostring(self)将调用__tostring元方法,所以这是一个死循环。

有没有办法获取值“ t”的原始字符串?

1 个答案:

答案 0 :(得分:1)

要通过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元函数应该返回该字符串,而不仅仅是打印它。