Ôn tập: điểm tọa độ
Thuộc phần Lập trình hướng đối tượng trong hành trình Rust của Coddy. Bài học 28 trên 61.
Thử thách
DễHãy cùng xây dựng một hệ tọa độ linh hoạt, hoạt động với mọi kiểu số! Bạn sẽ tạo một cấu trúc Point tổng quát có thể biểu diễn vị trí bằng số nguyên cho các trò chơi dạng lưới hoặc bằng số thực dấu phẩy động cho đồ họa chính xác, tất cả chỉ với một định nghĩa.
Bạn sẽ sắp xếp code trong hai tệp:
point.rs: Định nghĩa cấu trúcPoint<T>tổng quát, công khai, với hai trường công khai làxvày, cả hai đều có kiểuT. Cài đặt các phương thức cho điểm:- Một hàm liên kết
newtạo điểm từ tọa độ x và y - Một phương thức
translatenhận các giá trị dx và dy, rồi trả về mộtPointmới với tọa độ được dịch chuyển theo các giá trị đó (việc này yêu cầuThỗ trợ phép cộng và sao chép, vì vậy hãy dùng ràng buộcT: std::ops::Add<Output = T> + Copy)
- Một hàm liên kết
main.rs: Đưa module point vào và minh họa cách cùng một cấu trúc tổng quát hoạt động liền mạch với các kiểu số khác nhau.
Trong tệp chính, hãy minh họa cấu trúc tổng quát Point bằng cách:
- Tạo một điểm số nguyên bằng hai đầu vào đầu tiên (phân tích thành
i32) - Dịch chuyển điểm đó bằng đầu vào thứ ba và thứ tư (cũng là
i32) - Tạo một điểm số thực dấu phẩy động bằng đầu vào thứ năm và thứ sáu (phân tích thành
f64) - Hiển thị cả ba điểm
Đầu ra cần theo định dạng này:
Integer point: ({x}, {y})
After translation: ({x}, {y})
Float point: ({x}, {y})Ví dụ, với các đầu vào 3, 5, 2, -1, 1.5 và 2.5:
Integer point: (3, 5)
After translation: (5, 4)
Float point: (1.5, 2.5)Hãy chú ý cách Point::new(3, 5) tạo ra một Point<i32>, còn Point::new(1.5, 2.5) tạo ra một Point<f64>: cùng một định nghĩa cấu trúc có thể thích ứng với cả hai!
Bạn sẽ nhận sáu đầu vào: hai số nguyên cho điểm đầu tiên, hai số nguyên để dịch chuyển và hai số thực dấu phẩy động cho điểm thứ hai.
Tự làm thử
mod point;
use point::Point;
fn main() {
// Đọc các giá trị đầu vào
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: Tạo một điểm có tọa độ nguyên từ x1 và y1
// TODO: Tịnh tiến điểm có tọa độ nguyên theo dx và dy
// TODO: Tạo một điểm có tọa độ thực từ x2 và y2
// TODO: In kết quả theo định dạng yêu cầu:
// println!("Integer point: ({}, {})", ...);
// println!("After translation: ({}, {})", ...);
// println!("Float point: ({}, {})", ...);
}
Tất cả bài học trong Lập trình hướng đối tượng
1Phương thức và hành vi
Nhập môn khối triển khaiTham số selfPhương thức có thể thay đổiHàm liên kếtNhiều khối triển khaiNối chuỗi phương thứcÔn tập: thao tác với hình chữ nhật4Dự án: Thú cưng ảo
Định nghĩa thú cưngCho thú cưng ăn7Các trait tiêu chuẩn
Trait DebugTrait DisplayClone và CopyCác trait so sánh bằngÔn tập: Điểm có thể in ra2Tính đóng gói và module
Kiến thức cơ bản về moduleTừ khóa publicTrường riêng tưHàm lấy giá trịHàm thiết lập giá trịÔn tập: tủ khóa an toàn5Kiểu tổng quát
Cấu trúc tổng quátPhương thức tổng quátNhiều kiểu tổng quátHàm tổng quátÔn tập: điểm tọa độTự luyện tập: Trình biên dịch Rust online