当在lua中打印某些类型时(例如函数和表),您将得到类型的名称和地址,如下所示:
> tab = {}
> print(tab)
table: 0xaddress
我创建了一个简单的类,如下所示,我想类似地重写__tostring
方法。如何获取要打印的对象的地址?
这是我的课。我想要print(pair)
打印出Pair: 0xaddress
。显然,这是一个简单的例子,但是这个概念很有用:
Pair = {}
Pair.__index = Pair
function Pair.create()
local p = {}
setmetatable(p, Pair)
p.x = 0
p.y = 0
return p
end
function Pair:getx()
return self.x
end
function Pair:gety()
return self.y
end
function Pair:sety(iny)
self.y=iny
end
function Pair:setx(inx)
self.x=inx
end
这是一种骗人的方式:
Pair.__tostringx = function (p)
Pair.__tostring = nil
local s = "Pair " .. tostring(p)
Pair.__tostring = Pair.__tostringx
return s
end
Pair.__tostring = Pair.__tostringx
> print(p)
Pair table: 0x7fe469c1f900
您可以在Pair.__tostringx
中进行更多的字符串操作,以获取所需的格式,例如,删除“表格”。
我认为打印__tostring()
的table: 0xaddress
实际上不是直接在Lua中实现的。我环顾了一圈,但我想做的唯一方法并不完全是您的想法。我在Pair类中添加了一个名为toString的函数,该函数使用默认的__tostring()
获取普通字符串,然后取出“ table”并放入“ Pair”。
function Pair:toString()
normalPrint = tostring(self)
return ("Pair:" .. normalPrint:sub(7))
end
pair = Pair.create()
print(pair:toString())
然后调用Pair:toString()以获取格式正确的输出。覆盖__tostring时无法执行此操作,因为访问超级类的__tostring会很困难,并且如果调用Pair的__tostring,则递归会发生堆栈溢出。
与您使用的语法不同,但是可以:(但是可以打磨)
Pair = {}
Pair.address = string.gsub(tostring(Pair), "table:", "") --Gets the original address as a string.
local metas = {
__tostring = function(tab)
return "Pair:" .. tab.address
end
}
setmetatable(Pair, metas)
print(Pair) --Will print Pair: 0xaddress