7

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

5 回答 5

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来得到你想要的格式,例如,删除“table”。

于 2012-10-08T19:08:13.373 回答
1

我认为那个__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 时不能这样做,因为您将很难访问 super 的 __tostring,并且如果您调用 Pair 的 __tostring,递归会发生堆栈溢出。

于 2012-10-08T18:53:59.163 回答
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
于 2019-12-14T04:36:14.023 回答
0

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

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

它打印:

Pair: 0x5575ef88cf50
于 2021-03-03T15:24:41.840 回答
0
local function f() end
local t = {}

print(f, t)
print(string.format("%p\t%p", f, t))

--[[
function: 0x8813c0  table: 0x881810
0x8813c0    0x881810
]]

在https://www.lua.org/demo.html上测试。

于 2021-10-10T16:22:50.520 回答