2009-10-04 2 views
2

싱글 톤 방법이 객체 레벨에서 루비에서 어떻게 작동하는지 이해하기가 어렵습니다. 간단한 Person 클래스를 정의하고 싱글 톤 메소드와 인스턴스 메소드를 추가하고 해당 객체의 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 

은 이제 Person 객체 인스턴스의 싱글 톤 클래스에 메소드 prsn1_specific_method를 추가하고 (8 호선)가에서 그 개체 ID에 액세스 할 수 있습니다. 그런 다음 인스턴스 메서드 메서드 1 내가 맞으면 동일한 고유 클래스 (35 행)에 액세스합니다. (줄 번호가 정확하지 않을 수 있으므로 명확하게 설명했습니다.) 두 객체 ID가 동일한 싱글 톤 클래스의 일부인 경우 prsn1 개체 인 이유는 무엇입니까?

또한 Person 클래스의 Line 19 오브젝트 ID와 Line 23 오브젝트 ID는 Person 클래스 용으로 작성된 동일한 싱글 톤 클래스의 일부인 경우에도 서로 다릅니다. 개체 ID 액세스에 문제가 있습니까? 클래스 객체가 특정 객체에 대해 싱글 톤 메소드가 생성 될 때 어떻게 연관되는지에 대해 더 잘 설명해 줄 수 있으면 제발.

한가지 더, '싱글 톤'을 필요로하지 않고 싱글 톤을 모듈로 사용하지 않고 배열 수백 개를 만들었더라도 (배열 클래스라고도 함) 추가 할 수있는 사용자 지정 메서드를 만들 필요가 있습니다. 사물.

감사

답변

3

prsn1_specific_methodself는 eigenclass 없습니다. eigenclass에 인스턴스 메소드를 정의하고 있는데, 인스턴스 메소드에서 self은 무엇입니까? 인스턴스! 따라서 self 개체는 prsn1입니다.