본문 바로가기

Rust

러스트 프로그래밍 - 스코프를 벗어나면 drop

https://www.yes24.com/Product/Goods/116789691

 

프로그래밍 러스트 - 예스24

『러스트 프로그래밍 공식 가이드』보다 더 친절하게, 한층 더 고급 기능까지 다룬다!이 책은 메모리 안전성과 신뢰할 만한 동시성에 예측 가능한 성능을 더한 러스트의 기능이 어떤 식으로 메

www.yes24.com

 

https://www.yes24.com/Product/Goods/116586619

 

만들면서 배우는 러스트 프로그래밍 - 예스24

고효율, 현대적 프로그래밍 언어 Rust의 결정적 해설서!러스트는 효율적이고 신뢰할 수 있으며 생산성이 높은 언어로, 프로그래머가 가장 배우고 싶어 하는 언어로 꼽힌다. 배울 가치가 높은 언

www.yes24.com

 

실습하면서 공부하고 정리한 것을 올린것입니다.

 

 

fn main() {
    // 블록 1
    {
        let s1 = String::from("인생에 뜻을 세우는 데 있어 늦은 때라곤 없다.");
        let s3 = String::from("계단을 밟아야 계단 위에 올라설 수 있다");
        // 블록 2 
        {
            let s2 = s1;
            println!("{}", s2);
        }

        // 블록2 중괄호 끝나는 시점에 s2의 값은 파기된다 
        println!("{}", s3);
    }
    // s3의 값도 파기된다. 
}

 

{} 중괄호를 벗어나면 값이 파기되고 범위 안에서 이용한 변수에 대해 자동으로 drop함수를 호출한다.

결과1 호출: 인생에 뜻을 세우는 데 있어 늦은 때라곤 없다.
결과2 호출: 계단을 밟아야 계단 위에 올라설 수 있다   

 

 

 

 

스코프의 또다른 예

struct와 enum 타입은 Copy가 아니다.

 

fn main() {
    struct Label {
        number: u32,
    }
    fn print(l: Label) {
        println!("STAMP: {}", l.number);
    }
    let l = Label { number: 3 };
    print(l);
    println!("My label number is: {}", l.number);
}

 

에러내용: error[E0382]: borrow of moved value: `l`

 

Label은 Copy가 아니므로 이를 print함수에 소유권이 전달되고 복귀하기 전에 drop된다. 만약 struct에 모든 타입이 Copy이고 싶으면 어트리뷰트(#[derive(Copy,Clone)]를 써서 만들 수 있다.