문제

객체가 불변인지(숫자, nil) 아닌지(배열, 해시, 객체) 테스트하는 쉬운 방법이 있습니까?즉, 다른 코드의 부작용으로 인해 변경될 수 있습니까?

동기 부여:버전이 지정된 값 저장소를 만들고 싶지만 일부 데이터가 배열입니다.배열 중 일부는 사용자 정의 개체를 저장하며 'in' 속성을 저장하고 검색하여 관계를 반전시킬 수 있습니다.하지만 기호 배열, 기타 배열 등을 저장할 수도 있고 싶습니다.

도움이 되었습니까?

해결책

루비에는 원시 물체가 없습니다. 따라서 이것은 직접적인 방식으로 감지 될 수 없습니다.

버전의 매장에 Marshal 또는 Yaml을 사용할 수 없습니까? 그런 다음 모든 객체 유형을 무료로로드하고 저장할 수 있습니다. 왜 바퀴를 재창조합니까?

나는 당신이 정확히 무엇을 달성하고 싶은지 모르겠지만, Yaml의 출처를 보는 것은 그들이이 문제를 어떻게 처리하는지 보는 것이 흥미로울 수 있습니다. Ruby Yaml 인코딩 구현은 단순히 그것을 구현합니다 to_yaml 모든 관련 클래스에 대한 방법. 보다 Yaml/RubyTypes.rb.

다른 팁

비효율적 인 방법을 찾았습니다.

class Object
  def primitive?
    begin
      self.dup
      false
    rescue TypeError
      true
    end
  end
end

돌연변이에 대한 아이디어는 다른 언어와 같은 방식으로 루비에서 실제로 적용되지 않습니다. 유일한 불변의 대상은 얼어 붙은 대상입니다. FixNum에 메소드 및 인스턴스 변수를 추가 할 수도 있습니다. 예를 들어:

class Fixnum
  attr_accessor :name
end
1.name = "one"
2.name = "two"

분명히, 대부분의 시간은 사람들이 fixnum에 속성을 추가 할만 큼 병리학 적이 아니지만, 요점은, 끊어지지 않은 물체가 실제로 불변이 없다는 것입니다.

당신이 불변 할 수 없다고 가정하고 싶은 대포 수업 목록을 생각해 낼 수 있다면, 당신은 그냥지나 가서 그들 모두에게 줄 수 있습니다. immutable?() true를 반환하는 메소드 (그리고 거짓을 반환하는 버전). 그러나 Wvanbergen이 말했듯이, 객체의 사본이 변경되지 않도록하는 가장 좋은 방법은 마샬과 함께 심오한 것입니다.

또 다른 차이점:기본적으로 불변 객체는 고정할 수 없지만 고정에서 여전히 false를 반환합니까?

5.freeze.frozen? == false

Freeze는 dup과 달리 예외를 발생시키지 않습니다. 그러나 변경 가능한 개체를 (영구적으로!) 수정합니다.

나는 (적어도 현재 상태에서는) 고정된 객체와 작동하도록 내 앱을 배열할 수 있다는 것을 알았고, 직접 수정하려고 하면 Ruby에서 예외가 발생합니다.하지만 고정은 개체의 첫 번째 수준에만 영향을 미칩니다., 배열 등여기에 저장된 내용은 계속 수정할 수 있습니다.

이는 1.8 - 5에만 적용됩니다.frozen?ruby1.9에서는 true를 반환합니다(irb1.9에서는 그렇지 않음).

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