Rust 공식 doc 예제

고승우·2023년 6월 6일
0
post-thumbnail

직사각형의 구조체와 해당 사각형의 넓이를 계산하는 프로그램을 만들어 보자.

Tuples

fn main() {
    let rect1 = (30, 50);

    println!(
        "The area of the rectangle is {} square pixels.",
        area(rect1)
    );
}

fn area(dimensions: (u32, u32)) -> u32 {
    dimensions.0 * dimensions.1
}

tuple은 element에 이름을 붙이지 않기 때문에, 요소가 명확하게 무엇을 나타내는지 알기 힘들다.

Refactoring with Structs: Adding More Meaning

struct Rectangle {
    width: u32,
    height: u32,
}

fn main() {
    let rect1 = Rectangle {
        width: 30,
        height: 50,
    };

    println!(
        "The area of the rectangle is {} square pixels.",
        area(&rect1)
    );
}

fn area(rectangle: &Rectangle) -> u32 {
    rectangle.width * rectangle.height
}

우린 Rectangle이라는 구조체를 선언했다. area 함수는 struct를 immutable 하게 borrow한 타입을 인자로 받는다. 이런 방법으로 main함수가 struct의 소유권을 유지할 수 있도록 한다.

Adding Useful Functionality with Derived Traits

debuging 중에 Rectangle의 instance를 출력할 수 있다면 좋을 것 같다. println! 문을 활용해 struct를 출력하려고 하지만, 아래 코드는 작동하지 않는다.

struct Rectangle {
    width: u32,
    height: u32,
}

fn main() {
    let rect1 = Rectangle {
        width: 30,
        height: 50,
    };
    // error: 'Rectangle' doensn't implement 'std::fmt::Display'
    println!("rect1 is {}", rect1);
}

에러 내용을 읽다 보면 예쁜 출력을 위해서 println! '{:?}' 이나 '{:#?}'을 사용해보라고 권하지만, 이것 또한 작동하지 않는다. 대신 '#[derive(Debug)]' 를 사용해보라고 권한다. '#[derive(Debug)]'는 구조체의 내용을 보여주는 debug trait이다. 또한, {:?} 대신에 {:#?}를 사용하여 다른 스타일로 출력을 받아볼 수 있다.

#[derive(Debug)]
struct Rectangle {
    width: u32,
    height: u32,
}

fn main() {
    let rect1 = Rectangle {
        width: 30,
        height: 50,
    };
    println!("rect1 is {:?}", rect1);
}

dbg! 키워드를 활용해도 출력을 얻을 수 있다. dbg!width field의 값을 그대로 반환해주기 때문에, width field는 의도했던 30 * scale의 값을 그대로 갖게 되고, rect1의 소유권을 dbg!가 가져가게 두고 싶지 않으므로 reference를 활용한다.

#[derive(Debug)]
struct Rectangle {
    width: u32,
    height: u32,
}

fn main() {
    let scale = 2;
    let rect1 = Rectangle {
        width: dbg!(30 * scale),
        height: 50,
    };

    dbg!(&rect1);
}
profile
٩( ᐛ )و 

0개의 댓글