프로그래밍/프로그래밍언어

[rust] Struct & #[derive(Debug)]

Hithero 2022. 1. 9. 20:07

Rust Language Book 에서 chapter 5.2 에서 struct을 배우는 간단한 프로그래밍인데, Debug를 위한 rust 기능들이 있어서 이를 기록하기 위해서 작성하였다.

간단하게 struct는 c/c++에서 사용하는 방법과 비슷한다.

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

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

/* 에러 내용
= help: the trait `std::fmt::Display` is not implemented for `Rectangle`
= note: in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead
*/

선언까지는 문제없이 진행된다. (여기까지가 Struct 사용법안내) 다만 c/c++와 동일하게 구조체자체를 print하려고 하면 에러가 발생한다. (여기서 부터 Debug를 위한 rust 기능 설명)

에러 내용을 보면 {} 형식보다 {:?} 또는 {:#?} 을 사용하라고 한다.

println!("rect1 is {:?}", rect1); // Compile error

/* 에러 내용
   = help: the trait `Debug` is not implemented for `Rectangle`
   = note: add `#[derive(Debug)]` to `Rectangle` or manually `impl Debug for Rectangle`
*/

하라는 대로 했더니 또 에러가 난다. 에러내용을 읽어보면 해당 내용을 추가하라고 한다.

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

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

    println!("rect1 is {:?}", rect1);
}

위와 같이 정리하고, cargo run을 실행해보면 문제없이 출력 되는 것을 볼 수 있다. [src/main.rs:14] 출력 부분.

$ cargo run
   Compiling rectangles v0.1.0 (file:///projects/rectangles)
    Finished dev [unoptimized + debuginfo] target(s) in 0.61s
     Running `target/debug/rectangles`
[src/main.rs:10] 30 * scale = 60
[src/main.rs:14] &rect1 = Rectangle {
    width: 60,
    height: 50,
}

[src/main.rs:10] 부분을 보면, 구조체 인스턴스를 선언한 부분에 dbg!(30 * scale)을 통해서 디버그 로그를 찍은 것을 볼 수 있다. 아래의 코드와 동일하지만, 디버그용 로그를 찍어주는 것을 볼 수 있다.

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

 

해당 글에서 세가지를 배웠다.

1. 구조체 쓰는 방법

2. Display 메소드(?)가 추가되어있지 않는 상황에서 현재 구조체 상황을 알기위해 #[derive(Debug)] 와 {:#?} 사용 방법

3. 디버그를 위한 dbg!() 사용법

728x90
반응형