2011-12-20 5 views
3

클래스 메서드에서 특정 클래스에 대해 만든 인스턴스의 이름을 가져 오는 방법이 있습니까? 나는 새로운 해시는 데에 개체의 값을 저장하기 위해 노력하고있어 모듈의 마지막 세 번째 줄에인스턴스 이름 가져 오기

module MyObjectStore 
    values = {} 
    temp= {} 
    define_method :add_check_attribute do |method,*args| 
    if method.to_s =~ /=$/ 
     temp[method[0..-2]] = args[0] 
    else 
     instance_variable_get("@#{method}") 
    end 
    end 
    define_method :method_missing do |method,*args| 
    add_check_attribute(method,*args) 
    end 
    define_method :save do 
    temp.each {|key,value| instance_variable_set("@#{key}",value)} 
    values[self] = temp 
    end 
end 

class C 
    include MyObjectStore 
end 

a = C.new 
a.id = 1 
a.name = 'gaurav' 
a.save 

:

내가 할 노력하고있어입니다 인스턴스 이름을 키로 사용합니다.

그게 가능합니까?

지금은 self을 사용하고 있지만 인스턴스 이름이 아닌 전체 개체를 제공합니다.

답변

6

Ruby 객체에는 메모리 주소 외에 이름이 없습니다. 하지만 각 개체에는 항상 고유 한 object_id이 있습니다. ObjectSpace._id2ref을 사용하면 인스턴스와 ID를 서로 바꿀 수 있습니다. 다음은 예입니다 :

id="Hello, World".object_id => 82609910 
ObjectSpace._id2ref(id)  => "Hello, World" 
"Hello, Ruby".object_id  => 82721540 

그것의 수명에 걸쳐 개체에 대한 지속적인 있지만 개체 ID는, 거의 결코 일정한 프로그램의 실행, 그리고 동일한 데이터를 다른 개체 간의 없다는 것을 언급 할 가치가있다 다른 ID를 갖게됩니다

"Hi".object_id     => 82719050 
"Hi".object_id     => 82715090 

개체 ID는 또한 소스 코드에 등 안 하드 코드 개체 ID를 의존하고 OS에 의존 실행 만이 object_id을 가지고 ID를 사용합니다.

+0

위대한 남자, 이것은 내가 찾고 있었던 정확하게 것이다. 엄청 고마워!! –

+0

물론입니다. 다행히 도울 수있어. – Linuxios

2

인스턴스 이름은 무엇이되어야합니까? 특정 속성 (예 : name)에 대해 언급하지 않는 한 인스턴스에는 실제로 이름이 없습니다. 변수는 이름이 있지만 두 개는 구별됩니다.

그래서 :

  • 이 객체는 인터프리터에서 사용하는 일부 메모리 핸들 또는 유사한 메커니즘을 제외하고 "이름"을 가지고 있지 않습니다.
  • 변수의 이름은 있지만 프로그램 실행 중에 다른 인스턴스를 참조 할 수 있습니다.
  • 다른 변수가 동일한 인스턴스를 참조 할 수 있습니다.

마지막 점에서 인스턴스가 "이름"을 어떻게 결정해야합니까?

이 문제를 해결하는 한 가지 방법은 메모리 주소 나 해싱 함수를 개체 이름으로 사용하는 것입니다. 해시 함수는 객체가 변경 될 때 변경되기 때문에 조금 까다 롭습니다.

모든 인스턴스에 id 또는 name 필드를 사용하고이를 사용할 수도 있습니다. 고유하게 유지하십시오. 재미있게 지켜라. 미쳐 버려. 다시 깨달으십시오. 우리에게 가르쳐주세요.

+0

위의 코드와 마찬가지로, 나는 클래스 C의 인스턴스로 ** a **을가집니다. 이 값 "a"를 해시 키로 사용하고 싶습니다. –

+0

@Gaurav Manchanda'a'는 클래스'C'의 인스턴스를 단지 참조하는 인스턴스가 아닙니다. – Howard

+0

@ GauravManchanda, 당신은 hsh.merge ({a.name => a})를하려하고 있습니까? 그러면 그 객체의 name 속성에 의해 객체에 대한 포인터가 생깁니다! –

관련 문제