2012-10-08 16 views
6

Podczas drukowania pewnych typów w Lua (takich jak funkcje i tablice), można uzyskać nazwę typu i adresu, jak poniżej:uzyskać adres obiektu lua

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

Stworzyłem prosta klasa jak poniżej i chciałbym podobnie zastąpić metodę __tostring. Jak uzyskać adres obiektu, który chcę wydrukować?

Oto moja klasa. Chciałbym print(pair) wydrukować Pair: 0xaddress. Oczywiście jest to trywialny przykład, ale pojęcie to jest przydatne:

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 

Odpowiedz

7

Oto hokey sposób to zrobić:

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 

można zrobić więcej łańcuchach wewnątrz Pair.__tostringx aby uzyskać żądany format, na przykład, aby usunąć "stół".

+1

+1, ponieważ to działa, ale byłoby miło, gdyby Lua miała funkcję "rawtostring", aby takie hakowanie było niepotrzebne. – finnw

+0

To jednak nie jest bezpieczne dla wątków, prawda? – Llamageddon

1

myślę że __tostring() że drukuje table: 0xaddress nie jest faktycznie realizowane w prostej Lua. Rozejrzałem się wokół, ale jedynym sposobem, w jaki mogłem to zrobić, nie było dokładnie to, o czym myślałeś. Dodałem funkcję do klasy Pair o nazwie toString, która używa domyślnego __tostring(), aby uzyskać normalny ciąg znaków, a następnie wyjmuje "tabelę" i wstawia "Parowanie".

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

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

Następnie zadzwonić pary: toString(), aby uzyskać prawidłowo sformatowany wyjście. Nie możesz tego zrobić, pomijając __tostring, ponieważ będziesz miał trudności z uzyskaniem dostępu do __tostringu superu, a jeśli wybierzesz __tostring pary, pojawi się przepełnienie stosu z rekursji.