الكلمة المفتاحية 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 في كل مرة. هذا النهج المتمثل في "الخصوصية بشكل افتراضي" مقصود—فهو يشجعك على التفكير بعناية في أجزاء الكود التي يجب الكشف عنها للعالم الخارجي.
التحدي
سهلدعنا نبني كتالوج منتجات بسيطاً من خلال تنظيم الكود الخاص بك عبر ملفين وجعل العناصر الصحيحة عامة (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}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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 مع المعاملاتملخص - مشغل الوسائط