2011-11-25 5 views
22

Cuando hago un nuevo objeto, digamos¿Puedo o DEBO encontrar un objeto mediante el atributo object_id en ruby?

o = Object.new 

Este objeto tiene un id,

o.object_id 
#=> ######## 

También hago varios otros objetos, utilizando la clase Object. ¿Cuál sería la mejor manera de que Ruby encuentre el objeto 'o' utilizando el atributo object_id? Estoy pensando en términos de algo como

search_id = o.object_id 
search_result = Object.find(search_id) 

Donde 'search_results' sería el objeto correspondiente a 'search_id'. Además, definitivamente apreciaría un enfoque completamente diferente para indexar objetos y recuperarlos por un guid o algo así. ¡Muchas gracias!

Hah, bueno, supongo que realmente solo tengo que pensar en esto en el contexto de una base de datos y simplemente usar consultas MySQL o las de cualquier DB que elija para encontrar el objeto. Cuanto más lo pienso, las únicas cosas posibles a las que se podría acceder a través de este método imaginario de 'encontrar()' serían las cosas que se crearon recientemente o 'activas'. Perdón por hacer de esto una pregunta horrible.

Respuesta

53

Sí, puede:

irb(main):002:0> s1 = "foo" 
#=> "foo" 
irb(main):003:0> s2 = ObjectSpace._id2ref(s1.object_id) 
#=> "foo" 
irb(main):004:0> s2.object_id == s1.object_id 
#=> true 
irb(main):005:0> s2[0] = "z" 
#=> "z" 
irb(main):006:0> s1 
#=> "zoo" 

En caso de hacer esto? Te dejaré eso a ti. Hay formas menos geniales de almacenar un objeto con un número serializable id (por ejemplo, en una matriz y devolver el índice). Un problema con el que se puede encontrar es que si la única 'referencia' que mantiene para un objeto es object_id, el objeto puede ser recolectado por GC cuando no está buscando.

+0

Lo siento, me tomó tanto tiempo volver aquí. Esto definitivamente respondió mi pregunta básica. Envolví algunas cosas secundarias confusas, pero me ocuparé de eso por mi cuenta o en otra pregunta en algún momento. ¡Muchas gracias! – wuliwong

+1

si conservara todas las instancias creadas por su Clase en una variable de clase, podría evitar que sean basura, y podría usar el object_id para referenciarlas – Tilo

+0

'require require 'objspace'' - no trivial .... – ribamar

Cuestiones relacionadas