理解单例方法如何在Ruby中工作的问题

时间:2009-10-04 06:39:56

标签: ruby singleton

我正在努力理解单例方法在对象级别如何在Ruby中工作。当我定义一个简单的Person类并添加singleton方法和实例方法并尝试访问该对象的eigenclass对象id时,它返回不同的id。简单来说就是我的测试代码。

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对象实例的单例类中,并从那里访问它的对象id(第8行)。然后在实例方法 method1 中,如果我是正确的,我访问相同的本征类(第35行)。 (行号可能不正确,所以为了清楚起见,我已对它们进行了评论。)为什么两个不同的对象id,如果它们是为 prsn1 对象创建的同一个单例类的一部分。

对于Person类的第19行,对象id和第23行对象id也是不同的,如果它们是为Person类创建的同一个单例类的一部分。我是否在对象ID访问方面做错了?如果有人能够为特定对象创建单例方法时如何关联Class对象,请给我一个更好的解释。

还有一件事是,在不使用require'ingleton'并包含singleton作为模块的情况下,我需要创建一个我已添加到的自定义方法(比如Array类),即使我创建了数百个数组对象,它也只能作为一个方法使用

由于

1 个答案:

答案 0 :(得分:3)

self中的prsn1_specific_method不是本征类。您在本征类上定义了一个实例方法,实例方法中的self是什么?实例!因此,self指的是对象prsn1