2012-08-28 6 views
1

나는 무슨 일이 일어나고 있는지 알고 싶습니다.덤프 값이있는 해시가 변경되면 OpenStruct 값이 변경되는 이유는 무엇입니까?

다음 작업을 수행 할 때

new_struct = OpenStruct.new() 
new_struct.color = 'Red' 
new_struct.number = 4 

이 결과 :

params = { first: new_struct.marshal_dump } 

params[:first][:color] = 'Orange' 

이 변경 OpenStruct 결과 : 다음 몇 가지 PARAMS을 만들고 변경하는 경우

#<OpenStruct color="Red", number=4> 

~까지 :

#<OpenStruct color="Orange", number=4> 

왜 params 해시를 변경하면이 OpenStruct가 변경됩니까? 그리고 OpenStruct를 변경하지 않고 params 해시를 변경하는 방법이 있습니까?

감사합니다.

답변

2

놀라운 것은 아니지만 marshal_dump은 다른 해시처럼 변경할 수있는 OpenStruct 개체의 네임 스페이스로 해시를 반환합니다. 당신이이 문제를 방지하려면, 그것을 복제 : 루비 문서에 OpenStruct에 대한 marshal_dump() 항목에서

params = {first: new_struct.marshal_dump.clone} 
+0

감사합니다. 나는 약간의 이유가 있어야한다고 생각했습니다. OpenStruct는 db의 컬럼 중 하나 였고, 변화하고 있다는 사실에 놀랐습니다. – Lee

1

을 :

는 원수 라이브러리가 사용하는 정렬 화를 지원합니다. 키와 값으로 할당 된 함수가 들어있는 기본 Hash 테이블을 반환합니다.

marshal_dump()에서 얻은 해시는 실제로 OpenStruct의 기본 표현이므로 해시의 모든 변경 사항이 개체에 반영됩니다. 이 문제를 해결하기 위해 항상 해시를 복제 할 수 있습니다.

+0

설명 주셔서 감사합니다! – Lee

관련 문제