以下代码:
local t = {}
setmetatable(t, {__tostring = function(self) return 'MyTable is: '..tostring(self) end})
print(t)
运行代码将导致错误:“ C堆栈溢出”。因为在__tostring元方法中,tostring(self)将调用__tostring元方法,所以这是一个死循环。
有没有办法获取值“ t”的原始字符串?
答案 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
元函数应该返回该字符串,而不仅仅是打印它。