Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Printing 获取lua对象的地址_Printing_Lua - Fatal编程技术网

Printing 获取lua对象的地址

Printing 获取lua对象的地址,printing,lua,Printing,Lua,在lua中打印某些类型(如函数和表)时,将获得类型名称和地址,如下所示: > tab = {} > print(tab) table: 0xaddress 我已经创建了一个简单的类,如下所示,我希望类似地重写\uuuuToString方法。如何获取要打印的对象的地址 这是我的课。我想打印(配对)以打印出配对:0xaddress。显然,这是一个微不足道的例子,但这个概念很有用: Pair = {} Pair.__index = Pair function Pair.create()

在lua中打印某些类型(如函数和表)时,将获得类型名称和地址,如下所示:

> tab = {}
> print(tab)
table: 0xaddress
我已经创建了一个简单的类,如下所示,我希望类似地重写
\uuuuToString
方法。如何获取要打印的对象的地址

这是我的课。我想打印(配对)以打印出配对: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

我认为打印
表:0xaddress
\uuu-tostring()
实际上并没有在直接的Lua中实现。我环顾了很多地方,但我能想到的唯一方法并不是你想的那样。我在Pair类中添加了一个名为toString的函数,该函数使用默认的
\uu toString()
获取普通字符串,然后取出“table”并放入“Pair”


然后调用Pair:toString()以获得正确格式的输出。重写uu-tostring时不能执行此操作,因为访问super的u-tostring时会遇到困难,如果调用Pair的u-tostring,递归会发生堆栈溢出。

这里有一个hokey方法:

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

您可以在
对内执行更多的字符串操作。\uuuu tostringx
以获得所需的格式,例如,删除“table”。

与您使用的语法不同,但可以工作:(但是可以进行改进)


您可以在Lua 5.3或更高版本中使用
\u name

print(tostring(setmetatable({}, {__name = "Pair"})))
它打印:

Pair: 0x5575ef88cf50

+1因为这是可行的,但是如果Lua有一个
rawtostring
函数使这种黑客行为变得不必要,那就太好了。
print(tostring(setmetatable({}, {__name = "Pair"})))
Pair: 0x5575ef88cf50