에 분명히 발견
o = Object.new
o.freeze
o.clone.frozen?
#=> true
o.dup.frozen?
#=> false
clone
도 객체의 싱글 톤 메소드를 복사하지만 dup
은 그렇지 않습니다.
o = Object.new
def o.foo
42
end
o.clone.respond_to?(:foo)
#=> true
o.dup.respond_to?(:foo)
#=> false
clone
은 때로는 dup
보다 "더 깊은"복사본을 제공한다고 이해합니다.
Comment on ActiveRecord::Base#initialize_dup
from Rails 3 :
속아 객체에는 ID가 지정되어 있지 않고 새 레코드로 처리 한 다음 주제에 대한 몇 가지 따옴표입니다. 은 개체의 특성 인 만 복사하고 연관은 복사하지 않으므로이 복사본이 "얕은"사본임을 유의하십시오. "딥 (deep)"복사본의 범위는 특정 응용 프로그램 이며 따라서 응용 프로그램은 에 따라 구현해야합니다.
An article about deep copies in Ruby
:
, clone
을 언급 할 가치가 다른 방법이 있습니다. clone
메서드는 dup
과 동일한 역할을 하나의 중요한 차이가 있습니다. 개체가이 메서드를 전체 복사본을 수행 할 수있는 메서드로 재정의 할 것으로 예상됩니다.
But then again, theres deep_dup
in Rails 4
: 그것은 복사 가능한 있다면
객체의 깊은 카피를 돌려줍니다. 복사가 불가능한 경우 self
을 반환합니다.
and also ActiveRecord::Core#dup
and #clone
in Rails 4
:
clone
- 루비의 복제 방법과 동일합니다. 이것은 "얕은"사본입니다. 귀하의 속성은 복사되지 않는다는 경고를 받으십시오. [...] 속성 해시 복사본이 필요한 경우 #dup
메서드를 사용하십시오.
즉, 여기서 dup
이라는 단어는 딥 클론을 다시 나타내는 데 사용됩니다. 볼 수있는 한, 특정 부작용이 필요한 경우에는 clone
및 dup
을 사용해야한다는 점을 제외하고는 커뮤니티에서 합의가 이루어지지 않은 것으로 보입니다.
마지막으로 보다 Ruby 코드에서 더 자주 dup
이 표시됩니다. 지금까지 clone
을 사용한 적이 없으며 명시 적으로해야 할 때까지는 사용하지 않을 것입니다.
가능한 복제본 [Ruby의 dup과 복제 방법의 차이점은 무엇입니까?] (http://stackoverflow.com/questions/10183370/whats-the-difference-between-rubys-dup-and-clone-methods) – OlehZiniak