Могу я или ДОЛЖЕН найти объект по атрибуту object_id в ruby? - PullRequest
26 голосов
/ 25 ноября 2011

Когда я создаю новый объект, скажем,

o = Object.new

У этого объекта есть идентификатор,

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

Я также делаю несколько других объектов, используя класс Object. Как лучше всего было бы, чтобы ruby ​​нашел объект 'o' с помощью атрибута object_id? Я думаю, что-то вроде

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

Где 'search_results' будет объектом, соответствующим 'search_id'. Кроме того, я определенно был бы признателен за совершенно иной подход к индексации объектов и извлечению их с помощью guid или чего-то еще. Большое спасибо!

Ха, ну, я думаю, мне действительно нужно подумать об этом в контексте базы данных и просто использовать запросы MySQL или запросы к любой БД, которую я выберу, чтобы найти объект. Чем больше я думаю об этом, то единственными возможными вещами, которые будут доступны через этот воображаемый метод find (), будут вновь созданные или «активные» вещи? Извините за этот дерьмовый вопрос.

1 Ответ

60 голосов
/ 25 ноября 2011

Да, вы можете:

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"

Должны ли вы сделать это? Я оставлю это на ваше усмотрение. Есть менее вызывающие способы хранения объекта с сериализуемым значением id (например, в массиве и возвращающем индекс). Одна из проблем, с которой вы можете столкнуться, заключается в том, что если единственной «ссылкой», которую вы сохраняете на объект, является object_id, то объект может быть собран GC, когда вы не смотрите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...