2012-10-22 3 views
0

왜 루비가 클래스 인스턴스 변수 @var1을 덮어 씁니까?해시 덮어 쓰기

require 'pp' 
class Foo 
    @@def = { :key1 => "someval1", :key2 => "someval2" } 
    def initialize 
    @var1 = @var2 = @@def 
    @var1[:key1] = "newval1" 
    @var2[:key1] = "newval2" 
    pp(@var1) 
    pp(@var2) 
    end 
end 
f = Foo.new 

출력

{:key1=>"newval2", :key2=>"someval2"} 
{:key1=>"newval2", :key2=>"someval2"} 

이 일어난 이유를 말 해주세요. 어떻게 피할 수 있습니까?

답변

1

@var1@var2은 동일한 개체에 대한 참조입니다.

개별 값을 유지하려면 복사본@@def이어야합니다.

3

같은 해시를 가리 키도록 두 변수를 설정했기 때문에 이러한 현상이 발생합니다. 하나를 편집하면 3 개의 변수 (@@ def 포함)를 모두 편집 할 수 있습니다. 왜냐하면 모두 같은 해시이기 때문입니다.

가장 쉬운 방법은 clone 해시를 사용하는 것입니다.

@var2 = @@def.clone 
@var1 = @@def.clone