요약 - 좌표 지점
Coddy Rust 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 61개 중 28번째.
챌린지
쉬움어떤 숫자 타입과도 호환되는 유연한 좌표 시스템을 만들어 봅시다! 단일 정의만으로 그리드 기반 게임을 위한 정수 좌표나 정밀한 그래픽을 위한 부동 소수점 좌표를 모두 표현할 수 있는 제네릭 Point 구조체를 만들게 됩니다.
코드는 두 개의 파일로 구성됩니다:
point.rs: 두 개의 공개 필드x와y(모두T타입)를 가진 공개 제네릭Point<T>구조체를 정의합니다. 포인트에 대한 메서드를 구현하세요:- x와 y 좌표로부터 포인트를 생성하는
new연관 함수 - dx와 dy 값을 받아 해당 양만큼 이동된 좌표를 가진 새로운
Point를 반환하는translate메서드 (이를 위해서는T가 덧셈과 복사를 지원해야 하므로,T: std::ops::Add<Output = T> + Copy트레이트 바운드를 사용하세요)
- x와 y 좌표로부터 포인트를 생성하는
main.rs: point 모듈을 가져와서 동일한 제네릭 구조체가 서로 다른 숫자 타입과 어떻게 원활하게 작동하는지 보여줍니다.
메인 파일에서 다음을 통해 제네릭 Point를 시연하세요:
- 처음 두 개의 입력값(
i32로 파싱됨)을 사용하여 정수 포인트를 생성합니다. - 세 번째와 네 번째 입력값(마찬가지로
i32)을 사용하여 이를 이동(translate)시킵니다. - 다섯 번째와 여섯 번째 입력값(
f64로 파싱됨)을 사용하여 부동 소수점 포인트를 생성합니다. - 세 포인트 모두를 출력합니다.
출력은 다음 형식을 따라야 합니다:
Integer point: ({x}, {y})
After translation: ({x}, {y})
Float point: ({x}, {y})예를 들어, 입력값이 3, 5, 2, -1, 1.5, 2.5인 경우:
Integer point: (3, 5)
After translation: (5, 4)
Float point: (1.5, 2.5)Point::new(3, 5)는 Point<i32>를 생성하는 반면, Point::new(1.5, 2.5)는 Point<f64>를 생성하는 것을 확인해 보세요. 동일한 구조체 정의가 두 경우 모두에 적응합니다!
여섯 개의 입력을 받게 됩니다: 첫 번째 포인트를 위한 두 개의 정수, 이동을 위한 두 개의 정수, 그리고 두 번째 포인트를 위한 두 개의 부동 소수점 수입니다.
직접 해보기
mod point;
use point::Point;
fn main() {
// 입력 읽기
let mut input = String::new();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let x1: i32 = input.trim().parse().expect("Invalid input");
input.clear();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let y1: i32 = input.trim().parse().expect("Invalid input");
input.clear();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let dx: i32 = input.trim().parse().expect("Invalid input");
input.clear();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let dy: i32 = input.trim().parse().expect("Invalid input");
input.clear();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let x2: f64 = input.trim().parse().expect("Invalid input");
input.clear();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let y2: f64 = input.trim().parse().expect("Invalid input");
// TODO: x1과 y1을 사용하여 정수형 포인트를 생성하세요
// TODO: 정수형 포인트를 dx와 dy만큼 이동(translate)시키세요
// TODO: x2와 y2를 사용하여 부동 소수점형 포인트를 생성하세요
// TODO: 요구된 형식으로 결과를 출력하세요:
// println!("Integer point: ({}, {})", ...);
// println!("After translation: ({}, {})", ...);
// println!("Float point: ({}, {})", ...);
}