Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Ruby의 Dup vs Clone:​​차이점 이해하기

Ruby에서 객체를 복사할 수 있다는 사실을 알고 계셨습니까? 뿐만 아니라 이를 수행하는 두 가지 다른 방법이 있습니다!

이러한 방법은 :

  • dup
  • clone

잠시 후 차이점을 살펴보겠지만 먼저…

개체를 복제하려는 이유는 무엇입니까? ?

Ruby의 많은 객체는 변경 가능하므로 변경할 수 있습니다.

개체를 변경하고 싶지만 원본의 복사본을 유지하려는 경우 복제할 수 있습니다.

예를 들어.

첫 번째 요소를 제외한 모든 요소가 포함된 배열을 원할 수 있습니다.

한 가지 방법 :

a =[1,2,3,4,5]a[1..-1]# [2,3,4,5]

또 다른 방법은 :

b =a.cloneb.shift# [1]b# [2,3,4,5]

두 예 모두 원래 배열을 유지할 수 있습니다.

Ruby의 Dup vs Clone:​​차이점 이해하기

고정된 개체

복제와 복제는 다른 Ruby 메서드(map/collect)에서 발생하는 것처럼 서로의 별칭이 아니며, 약간의 차이점이 있습니다.

동일함과 차이점 탐색 두 가지 사이에 있는 것은 이해를 향상시키는 좋은 방법입니다. .

두 방법 모두 개체를 복사하지만 차이점은 dup 개체 속성을 복사하지 않습니다.

개체 속성은 무엇입니까?

  • 정지 상태
  • 오염된 상태
  • 싱글톤 클래스

예시 :

a =Object.new.freezeb =a.dupb.frozen?# falseb =a.cloneb.frozen?# true

Ruby 2.4에는 clone 옵션이 포함되어 있습니다. 복제된 개체의 고정 상태를 무시합니다.

:

a.clone(freeze:true)a.clone(freeze:false)

깊은 복사 vs 얕은 복사

개체를 복사하는 데는 눈에 보이는 것보다 더 많은 것이 있습니다.

사본을 만들 때 dup 또는 clone , 얕은 사본을 만들고 있습니다 .

즉, 다른 개체에 포함된 개체는 복사되지 않습니다.

:

문자열 배열이 있는 경우 문자열 자체가 아닌 배열만 복사됩니다.

직접 확인:

original =%w(사과 오렌지 바나나)copy =original.cloneoriginal.map(&:object_id)# [23506500, 23506488, 23506476]copy.map(&:object_id)# [23506500, 235035088,2 사전> 

배열을 복제한 후에도 개체 ID가 동일하므로 동일한 문자열을 갖습니다.

다음과 같이 해결할 수 있습니다.

strings.clone.map(&:clone)

이것은 어레이와 문자열 모두에서 복제되는 결과를 가져오지만, 이것은 한 레벨 깊이만 진행된다는 점에 유의하십시오. 대안으로 ActiveSupport의 deep_dup 방법을 시도할 수 있습니다.

요약

Ruby에서 객체 복제에 대해 배웠습니다! 복제 및 복제 방법, 얕은 복사와 깊은 복사의 차이점을 포함합니다.

읽어주셔서 감사합니다!