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

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

جزء من قسم Object Oriented Programming في رحلة Rust على Coddy — الدرس 13 من 61.

challenge icon

التحدي

سهل

لنقم ببناء نظام خزانة آمن يجمع كل ما تعلمته عن التغليف (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