Проблема в понимании того, как одиночные методы работают в Ruby - PullRequest
2 голосов
/ 04 октября 2009

Мне трудно понять, как синглтон-методы работают в 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) как один метод, даже если я создаю сотни объектов массива .

Спасибо

1 Ответ

3 голосов
/ 04 октября 2009

self в prsn1_specific_method не является собственным классом. Вы определяете метод экземпляра для собственного класса, и что такое self в методе экземпляра? Экземпляр! Следовательно, self там относится к объекту prsn1.

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