2012-06-21 4 views
4

내 프로그램에서 특정 Ruby 문자열을 변경할 수 없도록해야합니다. 가장 좋은 솔루션은 무엇입니까? String 클래스 이상의 래퍼를 작성하고 있습니까?Ruby 문자열을 변경 불가능하게 만들기

freeze 방법은 저에게 적합하지 않습니다. freeze에서 개체 고정을 해제 할 수 없습니다.

내 상황은 다음과 같습니다. 콜백에 문자열을 전달하는 클래스가 있습니다. 이 문자열은 클래스의 인스턴스 변수이므로 잠재적으로 커질 수 있습니다. 나는 콜백이 그것을 수정하기를 원하지 않지만, 클래스가 그것을 자유롭게 수정할 수 있도록 허용한다.

+4

String을 불변으로 만들고 싶지는 않지만 변이시킬 수있는 능력을 제한하는 것처럼 들린다. – zetetic

+0

@ zetetic : 동의 함. 그게 내가 원하는거야. – Kowshik

답변

10

다음은 내 상황 : 나는 콜백에 문자열을 전달하는 클래스가 있습니다.

문자열 복사본을 콜백 작업에 전달하겠습니까?

이 문자열은 실수로 클래스 의 인스턴스 변수 일 수 있으며 잠재적으로 커질 수 있습니다. 콜백이 수정하려면 을 원하지 않지만 클래스가 자유롭게 수정할 수 있도록 허용합니다.

문자열의 크기가 걱정된다면 String # dup을 사용하면 도움이됩니다. 고유 한 문자 인 object_id을 사용하여 새 객체를 만들지 만 새 문자열 (또는 원본)이 수정되지 않는 한 문자열의 내용은 복사되지 않습니다. 이를 "copy on write"라고하며, Seeing double: how Ruby shares string values에 설명되어 있습니다.

+0

'dup '을 사용하면 나에게 완벽하게 들립니다. 나중에 '디버깅'에 문제가 생길 수 있기 때문에 기본'String' 클래스를 수정하고 싶지는 않습니다. – Peter

+0

감사합니다. String # dup은 위의 시나리오에 가장 적합합니다. – Kowshik

2

문자열의 #freeze을 호출하십시오. 참조 : http://ruby-doc.org/core-1.9.3/Object.html#method-i-freeze

+0

고마워,하지만 이건 내 경우에는 작동하지 않을거야. 내 원래 게시물 편집을 참조하십시오. – Kowshik

+0

+1은 #dup frozen string이 항상 가능하기 때문에 결과가 변경 가능한 사본이 될 수 있으므로 +1하십시오. – Mike

관련 문제