获取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
点赞
用户805819
用户805819

我认为打印table: 0xaddress__tostring()实际上并没有在纯Lua中实现。我搜索了很多,但我能想到的唯一方法不完全是你想的那样。我在Pair类中添加了一个名为toString的函数,它使用默认的__tostring()来获取正常字符串,然后将“table”替换为“Pair”。

function Pair: toString()
    normalPrint = tostring(self)
    return ("Pair:".. normalPrint:sub7))
end

pair = Pair.create()
print(pair: toString())

然后你调用Pair: toString()来获取正确格式的输出。你不能在覆盖 __tostring 的同时执行这个操作,因为你将很难访问超类的 __tostring,如果你调用Pair的 __tostring,递归会导致堆栈溢出。

2012-10-08 18:53:59
用户33252
用户33252

以下是一种不正经的方式:

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-08 19:08:13
用户12534967
用户12534967
Pair = {}
Pair.address = string.gsub(tostring(Pair), "table:", "") --以字符串形式获取原始地址。
local metas = {
    __tostring = function(tab)
        return "Pair:" .. tab.address
    end
}
setmetatable(Pair, metas)
print(Pair) --将打印出 Pair: 0xaddress
2019-12-14 04:36:14
用户879607
用户879607

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

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

打印结果如下:

Pair: 0x5575ef88cf50
2021-03-03 15:24:41
用户14076600
用户14076600
```lua
local function f() end
local t = {}

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

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

```lua
local function f() end  -- 定义一个空函数
local t = {}  -- 定义一个空表

print(f, t)  -- 输出函数和表的地址(指针)
print(string.format("%p\t%p", f, t))  -- 输出函数和表的地址(指针),使用 string.format 格式化输出

--[[
function: 0x8813c0  table: 0x881810
0x8813c0    0x881810
]]
2021-10-10 16:22:50
用户449692
用户449692

尝试

function rawstr(t)
  local mt = getmetatable(t)
  local save_tostring
  if mt and mt.__tostring then
     save_tostring = mt.__tostring
     mt.__tostring = nil
  end
  local raw = tostring(t)
  if save_tostring then
    mt.__tostring = save_tostring
  end
  return raw
end

(注:这是 Lua 代码,实现了对一个变量的原始值转换)

2022-04-13 17:43:17