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

الكلمة المفتاحية Public

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

في الدرس السابق، تعلمت كيفية تنظيم الكود في ملفات وحدات (module) منفصلة. ومع ذلك، إذا حاولت استخدام هيكل Player من main.rs، فستواجه خطأ في المترجم (compiler). هذا لأن كل شيء في وحدة Rust يكون خاصاً بشكل افتراضي.

لجعل العناصر قابلة للوصول من خارج الوحدة (module) الخاصة بها، يجب عليك تمييزها صراحةً بالكلمة المفتاحية pub:

// player.rs
pub struct Player {
    pub name: String,
    pub score: u32,
}

impl Player {
    pub fn new(name: String) -> Player {
        Player { name, score: 0 }
    }
}

لاحظ كيف يظهر pub في أماكن متعددة—على الـ struct نفسه، وعلى كل حقل، وعلى الـ method. يحتاج كل عنصر إلى إعلان الرؤية الخاص به.

بدون pub في الـ struct، لا يمكن للملفات الأخرى حتى تسمية النوع. وبدون pub في الحقول، لا يمكنها الوصول إلى البيانات مباشرة. وبدون pub في الدوال (methods)، لا يمكنها استدعاؤها.

الآن في main.rs، يمكنك استخدام العناصر العامة للوحدة:

// main.rs
mod player;

use player::Player;

fn main() {
    let p = Player::new(String::from("Alice"));
    println!("{}", p.name);
}

تجلب عبارة use الـ Player إلى النطاق (scope) حتى لا تضطر إلى كتابة player::Player في كل مرة. هذا النهج المتمثل في "الخصوصية بشكل افتراضي" مقصود—فهو يشجعك على التفكير بعناية في أجزاء الكود التي يجب الكشف عنها للعالم الخارجي.

challenge icon

التحدي

سهل

دعنا نبني كتالوج منتجات بسيطاً من خلال تنظيم الكود الخاص بك عبر ملفين وجعل العناصر الصحيحة عامة (public) بحيث يمكن استخدامها من برنامجك الرئيسي.

ستقوم بإنشاء ملفين:

  • product.rs: قم بتعريف هيكل Product مع حقلين: name (String) و price (f64). أضف دالة مرتبطة تسمى new تأخذ الاسم والسعر وتعيد Product جديداً. تذكر أن تضع علامة عام (public) على الهيكل وحقوله والدالة بحيث يمكن الوصول إليها من خارج الوحدة (module).
  • main.rs: قم بالتصريح عن وحدة المنتج، واستدعِ Product إلى النطاق باستخدام جملة use، ثم أنشئ منتجاً واطبع تفاصيله.

فكر جيداً في المكان الذي تحتاج فيه إلى الكلمة المفتاحية pub—يجب أن يكون الهيكل نفسه مرئياً، ويجب أن تكون الحقول قابلة للوصول للقراءة، ويجب أن تكون دالة المنشئ (constructor) قابلة للاستدعاء من main.rs.

يجب أن يتبع مخرجك هذا التنسيق تماماً:

Product: {name}, Price: ${price}

على سبيل المثال، إذا قمت بإنشاء منتج باسم "Laptop" وسعر 999.99، فسيكون المخرج:

Product: Laptop, Price: $999.99

ستتلقى مدخلين: اسم المنتج والسعر.

ورقة مرجعية

في لغة Rust، كل شيء داخل الوحدة (module) يكون خاصاً بشكل افتراضي. لجعل العناصر قابلة للوصول من خارج وحدتها، استخدم الكلمة المفتاحية pub.

قم بتمييز الهياكل (structs)، والحقول (fields)، والدوال (methods) كعامة (public):

// player.rs
pub struct Player {
    pub name: String,
    pub score: u32,
}

impl Player {
    pub fn new(name: String) -> Player {
        Player { name, score: 0 }
    }
}

يحتاج كل عنصر إلى إعلان الرؤية الخاص به:

  • pub على الهيكل (struct) يجعل النوع مرئياً
  • pub على الحقول يسمح بالوصول المباشر إلى البيانات
  • pub على الدوال يسمح باستدعائها

استخدم جملة use لجلب العناصر إلى النطاق (scope):

// main.rs
mod player;

use player::Player;

fn main() {
    let p = Player::new(String::from("Alice"));
    println!("{}", p.name);
}

جرّب بنفسك

// التصريح عن موديول المنتج
mod product;

// TODO: استدعاء Product إلى النطاق الحالي باستخدام عبارة use

fn main() {
    // قراءة المدخلات
    let mut name = String::new();
    std::io::stdin().read_line(&mut name).expect("Failed to read line");
    let name = name.trim().to_string();
    
    let mut price_input = String::new();
    std::io::stdin().read_line(&mut price_input).expect("Failed to read line");
    let price: f64 = price_input.trim().parse().expect("Failed to parse price");
    
    // TODO: إنشاء منتج جديد باستخدام دالة Product::new
    
    // TODO: طباعة تفاصيل المنتج بالتنسيق التالي:
    // Product: {name}, Price: ${price}
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Object Oriented Programming