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 메서드(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에서 객체 복제에 대해 배웠습니다! 복제 및 복제 방법, 얕은 복사와 깊은 복사의 차이점을 포함합니다.
읽어주셔서 감사합니다!