我正在努力理解单例方法在对象级别如何在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类),即使我创建了数百个数组对象,它也只能作为一个方法使用
由于
答案 0 :(得分:3)
self
中的prsn1_specific_method
不是本征类。您在本征类上定义了一个实例方法,实例方法中的self
是什么?实例!因此,self
指的是对象prsn1
。