Мне трудно понять, как синглтон-методы работают в Ruby на уровне объектов. Когда я определяю простой класс Person и добавляю одноэлементные методы и методы экземпляра и пытаюсь получить доступ к идентификатору объекта собственного класса этого объекта, он возвращает разные идентификаторы. Проще говоря, вот мой тестовый код.
class Person
attr_accessor :someAccessor
def method1
puts "instance object id of Person = #{self.object_id}"
puts "Eigenclass object id of person instance object
#{(class << self; self;end).object_id}" #Line 8 - object id 22609690
end
puts "Person eigenclass object id #{(class << self; self;end).object_id}"
def self.printSingletonPersonObjectId
puts self.object_id
end
class << Person
puts "Inside Person eigenclass and its object id #{self.object_id}" #line 19 - 22609860
def uniqueForAllPeople
puts "Person eigenClass object id accessing from a Person class
class method #{self.object_id}" #Line 23 - 22609840
end
end
end
prsn1 = Person.new
class << prsn1
def prsn1_specific_method
puts "prsn1 object eigen class's object id #{self.object_id}" #Line 35 - 22609820
end
end
Теперь я добавляю метод prsn1_specific_method в одноэлементный класс экземпляра объекта Person и оттуда получаю доступ к его идентификатору объекта (строка 8). Затем в методе экземпляра method1 я получаю доступ к тому же собственному классу (строка 35), если я прав. (Номера строк могут быть неправильными, поэтому я закомментировал их для ясности.) Почему два разных идентификатора объекта, если они являются частью одного и того же синглтон-класса, созданы для этого prsn1 объекта.
А также для идентификатора объекта Line 19 класса Person и идентификатора объекта Line 23 также различаются, если они являются частью одного и того же одноэлементного класса, созданного для класса Person. Я делаю что-то не так с доступом к идентификатору объекта? Пожалуйста, если кто-то может дать мне лучшее объяснение того, как объекты Class ассоциируются при создании одноэлементного метода для конкретного объекта.
Еще одна вещь: без использования require 'singleton' и включения singleton в качестве модуля мне нужно сделать доступным добавленный мной метод (скажем, класс Array) как один метод, даже если я создаю сотни объектов массива .
Спасибо