2011-12-20 3 views
3

Есть ли способ получить имя экземпляра, который мы создали из определенного класса в методе класса?Получить имя экземпляра

Это то, что я пытаюсь сделать:

module MyObjectStore 
    values = {} 
    temp= {} 
    define_method :add_check_attribute do |method,*args| 
    if method.to_s =~ /=$/ 
     temp[method[0..-2]] = args[0] 
    else 
     instance_variable_get("@#{method}") 
    end 
    end 
    define_method :method_missing do |method,*args| 
    add_check_attribute(method,*args) 
    end 
    define_method :save do 
    temp.each {|key,value| instance_variable_set("@#{key}",value)} 
    values[self] = temp 
    end 
end 

class C 
    include MyObjectStore 
end 

a = C.new 
a.id = 1 
a.name = 'gaurav' 
a.save 

На третьей к последней строке модуля, я пытаюсь сохранить значение объекта в новом хэше, имеющем имя экземпляра в качестве ключа.

Есть ли что-нибудь подобное?

Теперь я использую self, но он дает весь объект, а не имя экземпляра.

ответ

6

Объекты Ruby не имеют имени, кроме адреса памяти. Однако у каждого объекта есть object_id, который всегда уникален. Используя ObjectSpace._id2ref, экземпляры и идентификаторы взаимозаменяемы. Вот пример:

id="Hello, World".object_id => 82609910 
ObjectSpace._id2ref(id)  => "Hello, World" 
"Hello, Ruby".object_id  => 82721540 

Стоит отметить, что идентификатор объекта, хотя константа для объекта через его жизнь, он почти никогда не постоянны между запусками программы, а также различными объектами, которые имеют те же данные будут иметь разные идентификаторы:

"Hi".object_id     => 82719050 
"Hi".object_id     => 82715090 

идентификаторы объектов также запускать зависимые и зависимые от ОС и т.д. Никогда жестких иды объектный код в исходный код, только использовать идентификаторы, которые вы получили через object_id.

+0

Отличный мужчина, Это именно то, что я искал. Благодаря тонну!! –

+0

Несомненно. Рад, что смог помочь. – Linuxios

2

Каким должно быть имя экземпляра? Если вы не говорите об определенном атрибуте (например, name), экземпляр на самом деле не имеет имени. Это может быть ссылкапеременные, у которых есть имя, но два разных.

Итак:

  • Объект не имеет «имя», для некоторой ручки памяти или аналогичного механизма, используемого интерпретатора, за исключением.
  • Переменные имеют имена, но могут ссылаться на разные экземпляры во время выполнения программы.
  • Различные переменные могут ссылаться на один и тот же экземпляр.

Учитывая последний момент, каким образом экземпляр должен принять решение о «имени»?

Одним из способов решения этой проблемы было бы использовать либо адрес памяти, либо какую-либо функцию хэширования как имя объекта. Хеширующая функция немного сложна, так как она изменится по мере изменения объекта.

Вы также можете выбрать поле id или name во всех своих экземплярах и использовать его. Держите его уникальным. Получайте удовольствие, гарантируя это. Сойти с ума. Возвращайтесь просветленным. Научите нас.

+0

Как и в приведенном выше коде, у меня есть ** ** как экземпляр класса C. Я хочу использовать это значение «a» в качестве ключа для хэша. –

+0

@Gaurav Manchanda 'a' - это не экземпляр, а просто _references_ экземпляр класса' C'. – Howard

+0

@GauravManchanda, вы пытаетесь сделать hsh.merge ({a.name => a}), тогда у вас будет указатель на объект a по атрибуту name этого объекта! –

Смежные вопросы