مراجعة - Coordinate Point
جزء من قسم Object Oriented Programming في رحلة Rust على Coddy — الدرس 28 من 61.
التحدي
سهللنقم ببناء نظام إحداثيات مرن يعمل مع أي نوع عددي! ستقوم بإنشاء هيكل Point عام (generic) يمكنه تمثيل المواقع باستخدام الأعداد الصحيحة للألعاب القائمة على الشبكة أو الأعداد العشرية للرسومات الدقيقة — كل ذلك من تعريف واحد فقط.
ستقوم بتنظيم الكود الخاص بك عبر ملفين:
point.rs: قم بتعريف هيكلPoint<T>عام وعام (public) مع حقلين عامين:xوy، وكلاهما من النوعT. قم بتنفيذ دوال لهيكلك:- دالة مرتبطة (associated function) باسم
newتقوم بإنشاء نقطة من إحداثيات x و y. - دالة (method) باسم
translateتأخذ قيم dx و dy وتعيدPointجديدة مع إزاحة الإحداثيات بتلك القيم (يتطلب هذا أن يدعمTالجمع والنسخ، لذا استخدم القيدT: std::ops::Add<Output = T> + Copy).
- دالة مرتبطة (associated function) باسم
main.rs: قم باستيراد وحدة point الخاصة بك وأظهر كيف يعمل نفس الهيكل العام بسلاسة مع أنواع عددية مختلفة.
في ملفك الرئيسي، استعرض هيكل Point العام الخاص بك من خلال:
- إنشاء نقطة أعداد صحيحة باستخدام أول مدخلين (يتم تحليلهما كـ
i32). - إزاحتها (translating) باستخدام المدخلين الثالث والرابع (أيضاً
i32). - إنشاء نقطة أعداد عشرية باستخدام المدخلين الخامس والسادس (يتم تحليلهما كـ
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
// TODO: إنشاء نقطة فاصلة عائمة باستخدام x2 و y2
// TODO: طباعة النتائج بالتنسيق المطلوب:
// println!("Integer point: ({}, {})", ...);
// println!("After translation: ({}, {})", ...);
// println!("Float point: ({}, {})", ...);
}
جميع دروس Object Oriented Programming
1الأساليب والسلوك
مقدمة في كتل التنفيذمعامل Selfالأساليب القابلة للتعديلالدوال المرتبطةكتل تنفيذ متعددةتسلسل الأساليبمراجعة - إجراءات المستطيل4مشروع: حيوان أليف افتراضي
تعريف الحيوان الأليفإطعام الحيوان الأليف2التغليف والوحدات البرمجية
أساسيات الوحدات البرمجيةالكلمة المفتاحية Publicالحقول الخاصةدوال Gettersدوال Settersمراجعة - الخزانة الآمنة5الأنواع العامة (Generics)
الـ Structs العامةالـ Methods العامةأنواع عامة متعددةالـ Functions العامةمراجعة - Coordinate Point3التعدادات المتقدمة (Advanced Enums)
التعدادات مع البياناتالأساليب (Methods) في التعداداتمطابقة حالات البياناتمراجعة التعداد Optionملخص - التعداد Shape6تعريف الـ Traits
ما هي الـ Trait؟تنفيذ الـ Traitsالتنفيذات الافتراضيةتجاوز التنفيذات الافتراضيةالـ Traits مع المعاملاتملخص - مشغل الوسائط