2012-10-08 12 views
6

Al imprimir ciertos tipos de lua (tales como las funciones y tablas), se obtiene el nombre del tipo y una dirección, como a continuación:obtener la dirección de un objeto lua

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

He creado una clase simple como a continuación, y me gustaría sobrescribir el método __tostring de manera similar. ¿Cómo obtengo la dirección del objeto que quiero imprimir?

Aquí está mi clase. Me gustaría print(pair) para imprimir Pair: 0xaddress. Obviamente, esto es un ejemplo trivial, pero el concepto es útil:

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 

Respuesta

7

Aquí está una manera de hacerlo 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 

Usted puede hacer más la manipulación de cadenas en el interior Pair.__tostringx para obtener el formato que desee, por ejemplo, para eliminar la "mesa".

+1

+1 porque esto funciona, pero estaría bien si Lua tuviera una función 'rawtostring' para hacer innecesario este tipo de hack. – finnw

+0

Esto no es seguro para subprocesos, ¿o sí? – Llamageddon

1

creo que la __tostring() que imprime table: 0xaddress no se aplica realmente en Lua recta. Miré a mi alrededor un montón, pero la única forma en que podía pensar en hacerlo no era exactamente lo que estabas pensando. Agregué una función a la clase Pair llamada toString que usa el valor predeterminado __tostring() para obtener la cadena normal, luego saca "tabla" y pone en "Pair".

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

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

Luego se llama a Pair: toString() para obtener la salida con el formato correcto. No puede hacer esto al anular __sobre la cadena porque le resultará difícil acceder a la cadena ___ de la supercomando, y si llama a __sobre la cadena, se produce un desbordamiento de pila de la recursión.

Cuestiones relacionadas