مراجعة - Coordinate Point
جزء من قسم البرمجة كائنية التوجه في رحلة Rust على Coddy. الدرس 28 من 61.
التحدي
سهللنبنِ نظام إحداثيات مرنًا يعمل مع أي نوع رقمي! ستنشئ بنية Point generic يمكنها تمثيل المواضع باستخدام أعداد integer للألعاب القائمة على الشبكات أو أعداد floating للرسومات الدقيقة: كل ذلك من تعريف واحد.
ستنظّم الشيفرة الخاصة بك عبر ملفين:
point.rs: Define بنيةPoint<T>generic وpublicتحتوي على حقلينpublic:xوy، وكلاهما من النوعT. Implement methodsلنقطتك:- دالة
newassociatedتنشئ نقطة من إحداثيي x وy - دالة
translateتأخذ قيمتي dx وdy وتُرجعPointجديدة مع إزاحة الإحداثيات بمقدار تلك القيم (يتطلب هذا أن يكونTقادرًا علىsupportadditionوcopying، لذا استخدم القيدT: std::ops::Add<Output = T> + Copy)
- دالة
main.rs: أدرِج وحدة النقطة الخاصة بك ووضّح كيف تعمل البنيةgenericنفسها بسلاسة مع أنواع رقمية مختلفة.
في ملفك الرئيسي، اعرض بنية Point generic الخاصة بك من خلال:
- إنشاء نقطة
integerباستخدام أول مدخلين (بعد تحليلهما كـi32) - إزاحتها باستخدام المدخلين الثالث والرابع (وهما أيضًا
i32) - إنشاء نقطة
floatingباستخدام المدخلين الخامس والسادس (بعد تحليلهما كـf64) - عرض النقاط الثلاث جميعها
يجب أن يتبع الناتج هذا format:
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>: يتكيف تعريف البنية نفسه مع كليهما!
ستتلقى ستة inputs: عددين صحيحين للنقطة الأولى، وعددين صحيحين للإزاحة، وعددين عشريين للنقطة الثانية.
جرّب بنفسك
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: Create an integer point using x1 and y1
// TODO: Translate the integer point by dx and dy
// TODO: إنشاء نقطة فاصلة عائمة باستخدام x2 و y2
// TODO: طباعة النتائج بالتنسيق المطلوب:
// println!("Integer point: ({}, {})", ...);
// println!("After translation: ({}, {})", ...);
// println!("Float point: ({}, {})", ...);
}
جميع دروس البرمجة كائنية التوجه
1الأساليب والسلوك
مقدمة في كتل التنفيذمعامل Selfالأساليب القابلة للتعديلالدوال المرتبطةكتل تنفيذ متعددةتسلسل الأساليبمراجعة - إجراءات المستطيل4مشروع: حيوان أليف افتراضي
تعريف الحيوان الأليفإطعام الحيوان الأليف2التغليف والوحدات البرمجية
أساسيات الوحدات البرمجيةالكلمة المفتاحية Publicالحقول الخاصةدوال Gettersدوال Settersمراجعة - الخزانة الآمنة5الأنواع العامة (Generics)
الـ Structs العامةالـ Methods العامةأنواع عامة متعددةالـ Functions العامةمراجعة - Coordinate Point3التعدادات المتقدمة (Advanced Enums)
التعدادات مع البياناتالأساليب (Methods) في التعداداتمطابقة حالات البياناتمراجعة التعداد Optionملخص - التعداد Shape6تعريف الـ Traits
ما هي الـ Trait؟تنفيذ الـ Traitsالتنفيذات الافتراضيةتجاوز التنفيذات الافتراضيةالـ Traits مع المعاملاتملخص - مشغل الوسائطتدرّب بنفسك: مترجم Rust عبر الإنترنت