14.5 Clone

리소스을 다룰 때, 기본적인 행위는 할당이나 함수 호출 시에 이들을 전달하는 것이다. 하지만 가끔은 리소스을 복사할 필요도 있다.

Clone trait은 정확히 이를 도와준다. 가장 범용적으로, 우리는 Clone trait에 의해 정의된 .clone()을 사용한다.

// A unit struct without resources
#[derive(Debug, Clone, Copy)]
struct Nil;

// `Clone` trait을 구현하는 리소스를 가진 튜플 구조체
#[derive(Clone, Debug)]
struct Pair(Box<i32>, Box<i32>);

fn main() {
    // `Nil` 인스턴스 생성
    let nil = Nil;
    // `Nil` 복사, 이동시킬 리소스가 없다.
    let copied_nil = nil;

    // 두 `Nil` 모두 독립적으로 사용할 수 있다.
    println!("original: {:?}", nil);
    println!("copy: {:?}", copied_nil);

    // `Pair` 인스턴스 생성
    let pair = Pair(Box::new(1), Box::new(2));
    println!("original: {:?}", pair);

    // `pair`를 `moved_pair`로 복사하며, 리소스도 이동시킨다.
    let moved_pair = pair;
    println!("copy: {:?}", moved_pair);

    // 에러! `pair`이 리소스를 잃었다.
    //println!("original: {:?}", pair);
    // TODO ^ 해당 라인의 주석을 제거해보세요.

    // `moved_pair`를 `cloned_pair`로 복제한다.(리소스 포함)
    let cloned_pair = moved_pair.clone();
    // std::mem:drop을 사용하여 원본 pair를 Drop시킨다.
    drop(moved_pair);

    // 에러! `moved_pair`가 삭제되었다.
    //println!("copy: {:?}", moved_pair);
    // TODO ^ 해당 라인의 주석을 제거해보세요.

    // .clone()을 통해 생성된 것은 아직 사용할 수 있다.
    println!("clone: {:?}", cloned_pair);
}

results matching ""

    No results matching ""