获取lua对象的地址

时间:2012-10-08 18:22:20

标签: printing lua

当你在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

4 个答案:

答案 0 :(得分:7)

这是一个很好的方法:

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内执行更多字符串操作,以获取所需的格式,例如删除“表格”。

答案 1 :(得分:1)

我认为打印__tostring()的{​​{1}}实际上并不是直接用Lua实现的。我环顾四周,但我能想到的唯一方法并不是你在想什么。我在Pair类中添加了一个名为toString的函数,它使用默认的table: 0xaddress来获取普通字符串,然后取出“table”并输入“Pair”。

__tostring()

然后调用Pair:toString()以获得格式正确的输出。在重写__tostring时你不能这样做,因为你很难访问super的__tostring,如果你调用Pair的__tostring,那么递归会发生堆栈溢出。

答案 2 :(得分:0)

与您使用的语法不同,但是可以:(但是可以完善)

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

答案 3 :(得分:0)

您可以在 Lua 5.3 或更高版本中使用 __name

print(tostring(setmetatable({}, {__name = "Pair"})))

它打印:

Pair: 0x5575ef88cf50