직사각형의 구조체와 해당 사각형의 넓이를 계산하는 프로그램을 만들어 보자.
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에 이름을 붙이지 않기 때문에, 요소가 명확하게 무엇을 나타내는지 알기 힘들다.
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의 소유권을 유지할 수 있도록 한다.
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);
}