مراجعة - الخزانة الآمنة
جزء من قسم البرمجة كائنية التوجه في رحلة Rust على Coddy. الدرس 13 من 61.
التحدي
سهللنبنِ نظام خزنة آمنًا يجمع كل ما تعلمته عن التغليف! ستحمي خزنتك محتوياتها خلف رمز سري: فقط من يعرف الرمز يمكنه رؤية ما بداخلها.
ستنشئ ملفين لتنظيم التعليمات البرمجية:
locker.rs: Define بنيةLockerتحتوي على حقلين private:code(u32) وcontents(String). يجب أن تكون البنية عامة، لكن يجب أن يظل كلا الحقلين private لحماية أمان الخزنة. Implement:- منشئ
newconstructor يأخذ رمزًا أوليًا ومحتويات - طريقة
set_codemethod تسمح بتغيير رمز الخزنة - طريقة
get_contentsmethod تأخذ رمزًا مُحاوَلًا؛ إذا كان يطابق رمز الخزنة، فأعد المحتويات؛ وإلا فأعد"Access denied"
- منشئ
main.rs: أضف وحدة الخزنة، وأنشئ خزنة، واعرض ميزات الأمان فيها من خلال محاولة الوصول إلى المحتويات باستخدام رموز صحيحة وغير صحيحة.
يجب أن تُرجع طريقة get_contents قيمة من النوع String، إما المحتويات الفعلية عندما يكون الرمز صحيحًا، أو رسالة الرفض عندما يكون خاطئًا. هذا هو getter الشرطي الخاص بك الذي يتحقق من الوصول قبل الكشف عن البيانات الخاصة.
يجب أن يتبع إخراجك هذا التنسيق exact:
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: غيّر رمز الـ locker إلى new_code
// Print: "Code changed"
// TODO: حاول الحصول على contents باستخدام رمز second_attempt
// اطبع: "Attempt with {code}: {result}"
}
جميع دروس البرمجة كائنية التوجه
1الأساليب والسلوك
مقدمة في كتل التنفيذمعامل Selfالأساليب القابلة للتعديلالدوال المرتبطةكتل تنفيذ متعددةتسلسل الأساليبمراجعة - إجراءات المستطيل4مشروع: حيوان أليف افتراضي
تعريف الحيوان الأليفإطعام الحيوان الأليف2التغليف والوحدات البرمجية
أساسيات الوحدات البرمجيةالكلمة المفتاحية Publicالحقول الخاصةدوال Gettersدوال Settersمراجعة - الخزانة الآمنة5الأنواع العامة (Generics)
الـ Structs العامةالـ Methods العامةأنواع عامة متعددةالـ Functions العامةمراجعة - Coordinate Point3التعدادات المتقدمة (Advanced Enums)
التعدادات مع البياناتالأساليب (Methods) في التعداداتمطابقة حالات البياناتمراجعة التعداد Optionملخص - التعداد Shape6تعريف الـ Traits
ما هي الـ Trait؟تنفيذ الـ Traitsالتنفيذات الافتراضيةتجاوز التنفيذات الافتراضيةالـ Traits مع المعاملاتملخص - مشغل الوسائطتدرّب بنفسك: مترجم Rust عبر الإنترنت