할당 연산자가없는 이유는 컴파일러 경고없이 루비 상수를 수정할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/670094

문제

다음 두 가지 예에서는 동일한 작업을 수행하여 상수 문자열을 만들고 CONCAT 메소드를 사용하여 수정합니다. 상수이기 때문에 컴파일러 경고를 기대하지만 할당 연산자를 사용할 때는 두 번째 예제에서만받습니다. 왜 이런거야?

X = "hello"
X.concat(" world")
puts X # no warning

X = "hello"
X = X.concat(" world")
puts X # warning: already initialized

CONCAT 메소드는 문자열을 제자리에 수정하기 때문에 일반적으로 제가 할 일입니다. Assigment Operator를 사용할 필요가 없기 때문입니다. 그렇다면 왜 할당 연산자의 존재로 인해 컴파일러 가이 두 작업을 다른 것으로 식별하게합니까?

도움이 되었습니까?

해결책

새로운 X를 다시 정의하기 때문입니다. 상수를 재정의하면 "이미 초기화 된"오류가 제공됩니다. 첫 번째 예제는 X를 재정의하지 않기 때문에이 오류가 발생하지 않으며 수정하고 있습니다.

다른 팁

루비에서 변수는 본질적으로 객체 자체가 아니라 객체를 포함하는 메모리의 장소로 포인터입니다. 두 번째 예에서는 상수를 초기화하고 있습니다. X 첫 번째 줄의 물체를 가리키기 위해 (X = "hello"), 두 번째 줄에서는 다시 상수를 초기화하고 있지만 이미 객체를 가리키므로 오류가 발생합니다.

상수의 불변성이 당신이 물체를 바꿀 수 없다는 것을 의미하지는 않습니다. 또 다른 물체.

문자열을 "실제"상수로 만들려면 '동결'을 시도하십시오.

X = "foo".freeze        # => "foo" 
X.concat("bar")

TypeError: can't modify frozen string
    from (irb):2:in `concat'
    from (irb):2

나는 당신이 정말로 읽는 것을 권장합니다 루비 프로그래밍 언어.

이것은 상수이기 때문입니다 X a에 대한 참조를 저장하고 있습니다 String 물체. 첫 번째 예에서는 내부 상태를 수정합니다. String 객체이지만 상수에 의해 저장된 참조는 아닙니다. 두 번째 예에서는 상수에 의해 저장된 참조를 새로운 String 객체에서 반환됩니다 concat 방법.

Pickaxe 책은 이것을 설명합니다 여기.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top