مراجعة - الخزانة الآمنة
جزء من قسم Object Oriented Programming في رحلة Rust على Coddy — الدرس 13 من 61.
التحدي
سهللنقم ببناء نظام خزانة آمن يجمع كل ما تعلمته عن التغليف (encapsulation)! ستحمي خزانتك محتوياتها خلف رمز سري—فقط من يعرف الرمز يمكنه رؤية ما بداخلها.
ستقوم بإنشاء ملفين لتنظيم الكود الخاص بك:
locker.rs: قم بتعريف هيكلLockerمع حقلين خاصين:code(u32) وcontents(String). يجب أن يكون الهيكل عاماً (public)، ولكن يجب أن يظل كلا الحقلين خاصين لحماية أمن الخزانة. قم بتنفيذ ما يلي:- منشئ
newيأخذ الرمز الأولي والمحتويات - طريقة
set_codeتسمح بتغيير رمز الخزانة - طريقة
get_contentsتأخذ رمزاً محاولاً—إذا تطابق مع رمز الخزانة، فقم بإرجاع المحتويات؛ خلاف ذلك، قم بإرجاع"Access denied"
- منشئ
main.rs: قم باستيراد وحدة الخزانة الخاصة بك، وأنشئ خزانة، واستعرض ميزات الأمان الخاصة بها من خلال محاولة الوصول إلى المحتويات باستخدام رموز صحيحة وغير صحيحة.
يجب أن تعيد طريقة get_contents قيمة من نوع String—إما المحتويات الفعلية عندما يكون الرمز صحيحاً، أو رسالة الرفض عندما يكون خاطئاً. هذا هو "الgetter" الشرطي الخاص بك الذي يتحقق من الوصول قبل الكشف عن البيانات الخاصة.
يجب أن يتبع مخرجك هذا التنسيق تماماً:
Attempt with {code}: {result}
Code changed
Attempt with {code}: {result}على سبيل المثال، إذا قمت بإنشاء خزانة بالرمز 1234 والمحتويات "Gold coins"، ثم جربت الرمز 0000، وغيرت الرمز إلى 5678، وجربت 5678، فسيكون المخرج:
Attempt with 0000: Access denied
Code changed
Attempt with 5678: Gold coinsستتلقى خمسة مدخلات: الرمز الأولي، المحتويات، رمز المحاولة الأولى، الرمز الجديد لتعيينه، ورمز المحاولة الثانية.
جرّب بنفسك
mod locker;
use locker::Locker;
fn main() {
// قراءة المدخلات
let mut input = String::new();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let initial_code: u32 = input.trim().parse().expect("Invalid number");
let mut input = String::new();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let contents = input.trim().to_string();
let mut input = String::new();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let first_attempt: u32 = input.trim().parse().expect("Invalid number");
let mut input = String::new();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let new_code: u32 = input.trim().parse().expect("Invalid number");
let mut input = String::new();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let second_attempt: u32 = input.trim().parse().expect("Invalid number");
// TODO: إنشاء Locker جديد باستخدام initial_code و contents
// TODO: محاولة الحصول على contents باستخدام رمز first_attempt
// طباعة: "Attempt with {code}: {result}"
// TODO: تغيير رمز الخزانة إلى new_code
// طباعة: "Code changed"
// TODO: محاولة الحصول على contents باستخدام رمز second_attempt
// طباعة: "Attempt with {code}: {result}"
}
جميع دروس 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 مع المعاملاتملخص - مشغل الوسائط