2017-03-03 1 views
-1

는 I 클래스 같이 가지고클래스의 상수 값이 변경되는 이유는 무엇입니까?

class Example 
    DEFAULT_VALUE = { 
     'first_key': ['a', 'b'], 
     'second_key': 'c' 
    } 

    def append_new_value(value) 
    default_value_copy = DEFAULT_VALUE 
    default_value_copy[:first_key] << value 
    puts "default_value_copy: #{default_value_copy}" 
    puts "DEFAULT_VALUE: #{DEFAULT_VALUE}" 
    end 
end 

example = Example.new 
example.append_new_value('d') 
example.append_new_value('e') 

결과이다 : 전에 알 수 있듯이

default_value_copy: {:first_key=>["a", "b", "d"], :second_key=>"c"} 
DEFAULT_VALUE: {:first_key=>["a", "b", "d"], :second_key=>"c"} 
default_value_copy: {:first_key=>["a", "b", "d", "e"], :second_key=>"c"} 
DEFAULT_VALUE: {:first_key=>["a", "b", "d", "e"], :second_key=>"c"} 

, DEFAULT_VALUE의 값 append_new_value 메소드를 호출 한 후 변경되지 않아야한다.

이 사례에 대해 설명해 주시겠습니까?

+0

상수는 변경되지 않습니다. 상수가 참조하는 객체입니다. 루비는 순전히 기능적인 언어가 아니며, 객체는 변경 될 수 있습니다. –

답변

0

우선 Ruby는 다른 언어에서 기대하는 것처럼 상수라는 개념을 가지고 있지 않습니다. 루비 상수는 값을 변경할 수 있습니다. Ruby에서 객체가 변형되지 않도록 지정하려면 Object#freeze 메소드를 사용해야합니다.

그런 다음 참조 또는 값으로 루비 전달 메소드 인수가 있습니다. 루비는 전통적인 의미에서 가치에 의한 것이라고 말할 수 있습니다. 그러나 Ruby에서 모든 변수는 객체에 대한 참조이므로 객체에 메서드를 전달하면 실제로 변이됩니다.

불변의 빠른 승리를 원하시면 Object#dup을 확인하십시오.

+0

'dup'은 얕은 복사본 만 생성합니다. 즉,'DEFAULT_VALUE [: first_key]'와'DEFAULT_VALUE.dup [: first_key]'는 여전히 같은 배열을 참조합니다. – Stefan

+0

@ 스 테판 당신 말이 맞습니다. 이 예제에서는 적용 할 수 없지만 참조 용으로 언급했습니다. – gkats

관련 문제