2012-10-08 9 views
6

Quando si stampa certi tipi a lua (quali le funzioni e tabelle), si ottiene il nome del tipo e un indirizzo, come di seguito:ottenere l'indirizzo di un oggetto lua

> tab = {} 
> print(tab) 
table: 0xaddress 

Ho creato un classe semplice come sotto, e mi piacerebbe sovrascrivere il metodo __tostring in modo simile. Come ottengo l'indirizzo dell'oggetto che voglio stampare?

Ecco la mia classe. Vorrei print(pair) stampare Pair: 0xaddress. Ovviamente questo è un esempio banale, ma il concetto è utile:

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 

risposta

7

Ecco un modo per farlo 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 

Si può fare di più manipolazione di stringhe all'interno Pair.__tostringx per ottenere il formato desiderato, ad esempio, per rimuovere "tavolo".

+1

+1 perché funziona, ma sarebbe bello se Lua avesse una funzione 'rawtostring' per rendere inutile questo tipo di hack. – finnw

+0

Questo non è thread-safe, vero? – Llamageddon

1

Penso che il __tostring() che stampa table: 0xaddress non è effettivamente implementata in Lua dritto. Mi sono guardato attorno, ma l'unico modo in cui potevo pensare di farlo non era esattamente quello che stavi pensando. Ho aggiunto una funzione alla classe Pair chiamata toString che usa il valore predefinito __tostring() per ottenere la stringa normale, quindi estrae "table" e inserisce "Pair".

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

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

Quindi si chiama Pair: toString() per ottenere l'output correttamente formattato. Non puoi farlo ignorando __tostring perché avrai difficoltà ad accedere al __tostring del super, e se chiami __tostring di Pair, si verifica un overflow dello stack dalla ricorsione.