이 문제 는 구현 세부 사항 ( memcpy
vs ???) 일뿐임을 암시하는 것 같지만 차이점에 대한 명시적인 설명을 찾을 수 없습니다.
답변
Clone
임의의 중복을 위해 설계되었습니다 Clone
. 유형에 대한 구현 T
은 새 파일을 만드는 데 필요한 임의의 복잡한 작업을 수행 할 수 있습니다T
. 이것은 일반적인 특성 (전주곡에있는 것 제외)이므로 일반적인 특성처럼 메서드 호출 등으로 사용되어야합니다.
Copy
특성은 안전하게 통해 중복 될 수있는 값 대표 memcpy
: 재 할당 항상 함수에 의해 값 인수를하는 통과 같은 것들을 memcpy
들, 등등에 대한 Copy
유형, 컴파일러가 그 고려할 필요가 없다는 것을 이해하고 이동 .
답변
주요 차이점은 복제가 명시 적이라는 것입니다. 암시 적 표기법은 Copy
유형 이 아닌 이동을 의미 합니다.
// u8 implements Copy
let x: u8 = 123;
let y = x;
// x can still be used
println!("x={}, y={}", x, y);
// Vec<u8> implements Clone, but not Copy
let v: Vec<u8> = vec![1, 2, 3];
let w = v.clone();
//let w = v // This would *move* the value, rendering v unusable.
그런데 모든 Copy
유형도 Clone
. 그러나 동일한 작업을 수행 할 필요는 없습니다! 자신의 유형에 .clone()
대해는 원하는 임의의 방법이 될 수 있지만 암시 적 복사는 항상 구현이 memcpy
아닌을 트리거합니다 clone(&self)
.
답변
이미 다른 답변에서 다루었 듯이 :
Copy
암시 적이며 저렴하며 다시 구현할 수 없습니다 (memcpy).Clone
명시 적이며 비용이 많이 들고 임의로 다시 구현할 수 있습니다.
Copy
vs 논의에서 때때로 누락 된 Clone
것은 컴파일러가 이동과 자동 복사를 사용하는 방식에도 영향을 미친다는 것입니다. 예를 들면 :
#[derive(Debug, Clone, Copy)]
pub struct PointCloneAndCopy {
pub x: f64,
}
#[derive(Debug, Clone)]
pub struct PointCloneOnly {
pub x: f64,
}
fn test_copy_and_clone() {
let p1 = PointCloneAndCopy { x: 0. };
let p2 = p1; // because type has `Copy`, it gets copied automatically.
println!("{:?} {:?}", p1, p2);
}
fn test_clone_only() {
let p1 = PointCloneOnly { x: 0. };
let p2 = p1; // because type has no `Copy`, this is a move instead.
println!("{:?} {:?}", p1, p2);
}
첫 번째 예제 ( PointCloneAndCopy
)는 암시 적 복사 때문에 여기에서 잘 작동하지만 두 번째 예제 ( PointCloneOnly
)는 이동 후 사용시 오류가 발생합니다.
error[E0382]: borrow of moved value: `p1`
--> src/lib.rs:20:27
|
18 | let p1 = PointCloneOnly { x: 0. };
| -- move occurs because `p1` has type `PointCloneOnly`, which does not implement the `Copy` trait
19 | let p2 = p1;
| -- value moved here
20 | println!("{:?} {:?}", p1, p2);
| ^^ value borrowed here after move
암시 적 이동을 피하기 위해 명시 적으로 let p2 = p1.clone();
.
이것은 Copy 특성을 구현하는 유형의 이동을 강제하는 방법에 대한 질문을 제기 할 수 있습니까? . 짧은 대답 : 말이 안 돼요 / 말이 안 돼요.