2012-08-01 6 views
12

What's the difference between Ruby's dup and clone methods?은 동작의 차이를 dupclone으로 설명합니다. 언제 dup을 사용해야하며 언제 대신 clone을 사용해야합니까?dup을 언제 사용하고 Ruby에서 복제본을 사용해야합니까?

복제본이 아닌 dup을 사용하는 이유에 대해 논한 실제 프로젝트의 예제 또는이 반대의 경우는이 질문에 이상적입니다.

또는 두 가지 다른 방법이 존재하는 이유에 대한 설명이 도움이 될 것입니다. 이것은 Ruby 제작자의 진술을 참조하거나 Ruby에 영향을주는 언어로 dupclone과 같은 메소드를 검사 할 수 있습니다.

+0

가능한 복제본 [Ruby의 dup과 복제 방법의 차이점은 무엇입니까?] (http://stackoverflow.com/questions/10183370/whats-the-difference-between-rubys-dup-and-clone-methods) – OlehZiniak

답변

7

에 분명히 발견

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이라는 단어는 딥 클론을 다시 나타내는 데 사용됩니다. 볼 수있는 한, 특정 부작용이 필요한 경우에는 clonedup을 사용해야한다는 점을 제외하고는 커뮤니티에서 합의가 이루어지지 않은 것으로 보입니다.

마지막으로 보다 Ruby 코드에서 더 자주 dup이 표시됩니다. 지금까지 clone을 사용한 적이 없으며 명시 적으로해야 할 때까지는 사용하지 않을 것입니다.

+0

지금은'clone'을 사용하지 않는 한'dup'을 사용해야하는 것처럼 보입니다 ('dup'가 더 간단 해 보입니다). 하지만 이제는 해시 복제에 관심이 있기 때문일 수 있습니다. 그래서 저는 얼어 붙은 상태와 싱글 톤 클래스에 관심이 없습니다. –

4

두 DUP & CLONE은 개체의 얕은 복사본을 만드는 데 사용할 수 있습니다. 둘 다 obj의 인스턴스 변수를 복사합니다. 그러나 우리는 그들의 용도를 선택해야합니다. 이들 사이

약간 차이

1)를 복제 냉동 DUP 만 복사 대상물의 오염 상태로 물체의 오염 상태 둘 다.

2) CLONE을 사용하면 객체의 싱글 톤 메소드를 복사 할 수 있지만 DUP는이를 지원하지 않습니다.

CLONE은 개체의 내부 상태를 포함하여 개체를 복제하는 데 사용되며 DUP는 일반적으로 하위 개체의 클래스를 사용하여 새 인스턴스를 만듭니다.

ActiveRecord 행을 복제하기 위해 DUP를 사용하는 동안 약간의 괴로운 경험이 있었지만, CLONE을 사용하여 원래의 것과 똑같이 작동하는 것을 잃었습니다. 내가 혼란에 자신을 포장으로 dup하지 않는 동안

는, 그 객체의 clone 복사 frozen 상태, 그것은 사실 인 Article of Open Source is Wide Open

+0

"루비에서 복사하는 방법에는 #dup, #clone 및 '='세 가지가 있습니다." -'= '는 어떻게 복사합니까? –

+0

나는 어떻게 '='복사가 더 깊어 질지 모르지만 얕은 복사도한다. 여기에 [좋은 예제] (http://thingsaaronmade.com/blog/ruby-shallow-copy-surprise.html)가 있지만, 요약하면 할당 연산자는 값의 복사본을 만들지 않고 간단히 복사합니다 객체에 대한 참조 –

+0

메모 :'Marshal :: load (Marshal.dump (foo)) '는 작동하지만 데이터베이스 모델에 문제가 발생할 수 있습니다. – sandstrom