시작 코드
fn main() {
let length1 = 50;
let width1 = 30;
println!(
"The area of the rectangle is {} square pixels.",
area(length1, width1)
);
}
fn area(length: u32, width: u32) -> u32 {
length * width
}
- 길이와 너비를 받아서 사각형의 면적을 구하는 프로그램이다.
- 별다른 문제는 없지만, 리팩토링으로 개선될 여지가 있는 코드이다.
1차 개선: 튜플 이용하기
fn main() {
let rect1 = (50, 30);
println!(
"The area of the rectangle is {} square pixels.",
area(rect1)
);
}
fn area(dimensions: (u32, u32)) -> u32 {
dimensions.0 * dimensions.1
}
- 튜플의 이름인
rect
를 이용해 길이와 너비가 사각형의 길이와 너비였음을 나타낼 수 있다. area()
함수 내부가 약간 맘에 들지 않는데,.0
과.1
을 사용하기 때문이다. 어떤 것이 길이고 어떤 것이 너비인지 구분이 가지 않는다.
2차 개선: 구조체 이용하기
struct Rectangle {
length: u32,
width: u32,
}
fn main() {
let rect1 = Rectangle { length: 50, width: 30 };
println!(
"The area of the rectangle is {} square pixels.",
area(&rect1)
);
}
fn area(rectangle: &Rectangle) -> u32 {
rectangle.length * rectangle.width
}
- 새롭게 표현되는
rectangle.length
와rectangle.width
는 명확한 의미를 전달한다.
파생 트레잇을 이용한 출력으로 출력 변경하기
struct Rectangle {
length: u32,
width: u32,
}
fn main() {
let rect1 = Rectangle { length: 50, width: 30 };
println!("rect1 is {}", rect1);
}
- 단순히 사각형의 정보를 출력하고 싶은데 위와 같은 코드를 작성하면, 에러가 발생한다.
error[E0277]: the trait bound `Rectangle: std::fmt::Display` is not satisfied
- 아래는 에러 밑에 있는 도움말이다.
note: `Rectangle` cannot be formatted with the default formatter; try using
`:?` instead if you are using a format string
도움말을 참조하여
println!("rect1 is {:?}", rect1);
위와 같은 코드를 작성하면 또 도움말이 나온다.
error: the trait bound `Rectangle: std::fmt::Debug` is not satisfied
note: `Rectangle` cannot be formatted using `:?`; if it is defined in your
crate, add `#[derive(Debug)]` or manually implement it
도움말을 참조하여 코드를 작성하면 아래와 같다.
#[derive(Debug)]
struct Rectangle {
length: u32,
width: u32,
}
fn main() {
let rect1 = Rectangle { length: 50, width: 30 };
println!("rect1 is {:?}", rect1);
}
- 달라진 점은
Rectangle
구조체 위의#[derive(Debug)]
애노테이션이다. - 이를 통해 여러 트레잇을 제공하여 커스텀 타입에 유용한 동작을 추가할 수 있다.
반응형
'러스트 (Rust)' 카테고리의 다른 글
러스트 (Rust) 열거형 1 - 기본 문법 (1) | 2022.12.03 |
---|---|
러스트 (Rust) 메서드 (Method) 문법 (0) | 2022.11.03 |
러스트 (Rust) 구조체 정의하고 생성하는 방법 (0) | 2022.11.03 |
러스트 (Rust) 의 슬라이스 (Slice) 개념 (0) | 2022.11.02 |
러스트 (Rust) 의 참조자 (References) 와 빌림 (Borrowing) 개념 (0) | 2022.11.02 |