تعريف البنى واستخدامها
أنشئوا هياكل بيانات مخصّصة باستخدام البنى، بما فيها البنى الصفية والبنى الشبيهة بالوحدات، لتجميع البيانات المرتبطة.
تعريف البنى واستخدامها درس مجاني في Learn Rust Coding على CoddyKit. هذا هو الدرس 1 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Learn Rust Coding، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Learn Rust Coding 3 دروس في المجموع.
تعرّفوا على البُنى: أنواع بيانات مخصّصة
في Rust، تُعد البُنى (اختصارًا للهياكل) طريقة لإنشاء أنواع بيانات مخصّصة تتيح لكم تسمية عدة قيم مترابطة وتجميعها معًا في مجموعة ذات معنى.
فكّروا في البنية على أنها مخطط لمستخدم أو لون أو نقطة في الفضاء. فبدلًا من استخدام متغيرات منفصلة لاسم المستخدم وبريده الإلكتروني وعمره، يمكنكم وضعها جميعًا داخل بنية User.
يساعدكم ذلك على تنظيم بياناتكم منطقيًا وجعل تعليماتكم البرمجية أسهل قراءة وصيانة.
تعريف بنية كلاسيكية
النوع الأكثر شيوعًا من البُنى هو البنية الكلاسيكية، حيث تسمّون كل جزء من البيانات، ويُسمى حقلًا. إليكم طريقة تعريفها:
struct User {
username: String,
email: String,
sign_in_count: u64,
active: bool,
}
fn main() {
// This code only defines the struct blueprint.
// No actual user has been created yet!
println!("Struct 'User' blueprint defined.");
}إنشاء مثيلات البُنى
بعد تعريف البنية، يمكنكم إنشاء مثيلات فعلية منها. تحتوي كل مثيلة على قيم محددة لحقولها. تنشئون المثيلة بتحديد قيم فعلية لكل حقل.
struct User {
username: String,
email: String,
sign_in_count: u64,
active: bool,
}
fn main() {
let user1 = User {
email: String::from("alice@example.com"),
username: String::from("alice123"),
active: true,
sign_in_count: 1,
};
println!("User instance created!");
}الوصول إلى حقول البُنى
لاستخراج البيانات من مثيلة بنية، تستخدمون الترميز النقطي. اكتبوا ببساطة اسم المثيلة، ثم نقطة (.)، ثم اسم الحقل.
struct User {
username: String,
email: String,
sign_in_count: u64,
active: bool,
}
fn main() {
let user1 = User {
email: String::from("alice@example.com"),
username: String::from("alice123"),
active: true,
sign_in_count: 1,
};
println!("User's username: {}", user1.username);
println!("User's email: {}", user1.email);
}قابلية التغيير مع البُنى
مثل المتغيرات العادية، يمكن جعل مثيلات البُنى بأكملها قابلة للتغيير باستخدام الكلمة المفتاحية mut. إذا كانت المثيلة قابلة للتغيير، فيمكن تغيير جميع حقولها.
لا يمكنكم جعل حقول معينة فقط قابلة للتغيير؛ إذ تنطبق قابلية التغيير على مثيلة البنية بأكملها.
struct User {
username: String,
email: String,
sign_in_count: u64,
active: bool,
}
fn main() {
let mut user1 = User {
email: String::from("alice@example.com"),
username: String::from("alice123"),
active: true,
sign_in_count: 1,
};
println!("Old email: {}", user1.email);
user1.email = String::from("new_alice@example.com");
println!("New email: {}", user1.email);
}بُنى الصفوف: حقول بلا أسماء
بُنى الصفوف هي شكل آخر من البُنى، وتشبه الصفوف لكنها تحمل اسمًا. وتكون مفيدة عندما تريدون منح صف اسم نوع مميز، من دون الحاجة إلى تسمية حقوله الفردية.
فعلى سبيل المثال، تمثل Color(i32, i32, i32) صفًا مسمى يجمع ثلاثة أعداد صحيحة.
struct Color(i32, i32, i32);
struct Point(i32, i32, i32);
fn main() {
let black = Color(0, 0, 0);
let origin = Point(0, 0, 0);
println!("Tuple structs 'Color' and 'Point' defined.");
}استخدام بُنى الصفوف
يشبه إنشاء مثيلة من بنية صفوف إنشاء صف عادي. وللوصول إلى القيم بداخلها، تستخدمون الترميز النقطي مع الفهرس الذي يبدأ من 0.
struct Color(i32, i32, i32);
struct Point(i32, i32, i32);
fn main() {
let black = Color(0, 0, 0);
let origin = Point(0, 0, 0);
println!("Black color: R={}, G={}, B={}", black.0, black.1, black.2);
println!("Origin point: X={}, Y={}, Z={}", origin.0, origin.1, origin.2);
}البُنى الشبيهة بنوع الوحدة: العلامات
يمكنكم أيضًا تعريف بُنى لا تحتوي على أي حقول على الإطلاق. وتُسمى هذه البُنى الشبيهة بنوع الوحدة لأنها تتصرف بطريقة مشابهة لنوع الوحدة ().
تُستخدم غالبًا كعلامات لتنفيذ سمة معينة على نوع ما، عندما لا تكون البيانات نفسها مهمة.
struct AlwaysTrue;
fn main() {
let subject = AlwaysTrue;
// Unit-like structs don't store data directly,
// but they can be instantiated and used as types.
println!("Unit-like struct 'AlwaysTrue' created.");
}صيغة تحديث البنية
إذا احتجتم إلى إنشاء مثيلة بنية جديدة بالاعتماد على مثيلة موجودة، مع رغبتكم في تغيير بعض قيم الحقول فقط، توفّر Rust صيغة تحديث البنية المريحة (..).
تنقل هذه الصيغة الحقول المتبقية من المثيلة المحددة، ولذلك لا تعود المثيلة الأصلية قابلة للاستخدام إذا كانت تحتوي على حقول تطبق Copy.
struct User {
username: String,
email: String,
sign_in_count: u64,
active: bool,
}
fn main() {
let user1 = User {
email: String::from("alice@example.com"),
username: String::from("alice123"),
active: true,
sign_in_count: 1,
};
let user2 = User {
email: String::from("bob@example.com"),
username: String::from("bob456"),
..user1 // Copy remaining fields from user1
};
println!("User 2 email: {}", user2.email);
println!("User 2 active: {}", user2.active);
// user1.username is now moved, so user1 can't be used here.
}اختبار البُنى
اختبروا مدى فهمكم لبُنى Rust.
مراجعة: نظرة عامة على البُنى
لقد تعلّمتم كيفية تعريف البُنى واستخدامها في Rust!
- تجمع البُنى الكلاسيكية الحقول المسمّاة لإنشاء أنواع بيانات مخصّصة.
- بُنى الصفوف هي صفوف مسمّاة، وتفيد عندما لا تكون أسماء الحقول ضرورية.
- لا تحتوي البُنى الشبيهة بنوع الوحدة على حقول، وتعمل كعلامات.
- يمكن جعل مثيلات البُنى
mutللسماح بتعديل حقولها. - تساعد صيغة
..على إنشاء مثيلات جديدة انطلاقًا من مثيلات موجودة.
تُعد البُنى أساسية لتنظيم البيانات المترابطة في برامج Rust، مما يجعل تعليماتكم البرمجية أكثر تنظيمًا وسهولة في القراءة.
الأسئلة الشائعة
هل درس «تعريف البنى واستخدامها» مجاني؟
نعم — نص درس «تعريف البنى واستخدامها» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Learn Rust Coding، انتقل إلى CoddyKit PRO. تتضمن دورة Learn Rust Coding 3 دروس في المجموع.
ماذا ستتعلم في «تعريف البنى واستخدامها»؟
أنشئوا هياكل بيانات مخصّصة باستخدام البنى، بما فيها البنى الصفية والبنى الشبيهة بالوحدات، لتجميع البيانات المرتبطة. تتمرن على Learn Rust Coding مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Learn Rust Coding؟
لا تُشترط خبرة سابقة. Learn Rust Coding على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 3.
كم من الوقت يستغرق درس «تعريف البنى واستخدامها»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Learn Rust Coding هذا؟
نعم. كل درس في Learn Rust Coding يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تعريف البنى واستخدامها
- التعدادات للأنواع المخصّصة
- مطابقة الأنماط القوية