Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

مراجعة - الخزانة الآمنة

جزء من قسم البرمجة كائنية التوجه في رحلة Rust على Coddy. الدرس 13 من 61.

challenge icon

التحدي

سهل

لنبنِ نظام خزنة آمنًا يجمع كل ما تعلمته عن التغليف! ستحمي خزنتك محتوياتها خلف رمز سري: فقط من يعرف الرمز يمكنه رؤية ما بداخلها.

ستنشئ ملفين لتنظيم التعليمات البرمجية:

  • locker.rs: Define بنية Locker تحتوي على حقلين private: code (u32) وcontents (String). يجب أن تكون البنية عامة، لكن يجب أن يظل كلا الحقلين private لحماية أمان الخزنة. Implement:
    • منشئ new constructor يأخذ رمزًا أوليًا ومحتويات
    • طريقة set_code method تسمح بتغيير رمز الخزنة
    • طريقة get_contents method تأخذ رمزًا مُحاوَلًا؛ إذا كان يطابق رمز الخزنة، فأعد المحتويات؛ وإلا فأعد "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}"
}

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Rust عبر الإنترنت