تهيئة الهياكل في Rust: بداية سريعة وحيل متقدمة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا تهيئة الهياكل في Rust ليست مملة؟

\n\n

إذا كنت قد كتبت بلغة Rust من قبل، فمن المؤكد أنك واجهت لحظة أردت فيها أن تقول: "لماذا يجب عليّ كتابة field: field مرارًا وتكرارًا؟ هذا واضح!"

\n\n

نعم، Rust لغة صارمة، دقيقة ومعبرة بشكل لا يصدق. ولكن حتى فيها مكان للسكر النحوي الذي يجعل الكود أقصر وأنظف وأكثر متعة للعين. خاصة فيما يتعلق بـ تهيئة الهياكل - تلك الروتينية التي نقوم بها عشرات المرات في اليوم.

\n\n

في هذه المقالة، لن نجيب فقط على السؤال الشائع من Stack Overflow: "هل هناك طريقة أسرع/أقصر لتهيئة المتغيرات في هيكل Rust؟". بل سنشرح جميع الطرق - من الأساسية إلى المتقدمة - ونوضح كيفية كتابة كود سريع وقابل للقراءة و"على طريقة Rust" (idiomatic Rust).

\n\n

هل أنت مستعد لتسريع عملك مع هياكل Rust؟ لنبدأ!

\n\n

1. الطريقة التقليدية: تسمية الحقول بشكل صريح

\n\n

لنبدأ بالأساسيات. لنفترض أن لدينا هيكل User:

\n\n
struct User {\n    username: String,\n    email: String,\n    sign_in_count: u64,\n    active: bool,\n}
\n\n

التهيئة القياسية تبدو كالتالي:

\n\n
let user1 = User {\n    email: String::from("someone@example.com"),\n    username: String::from("someusername123"),\n    active: true,\n    sign_in_count: 1,\n};
\n\n

كل شيء صريح وواضح. ولكن عندما يكون لديك 10-15 حقلًا، وتتطابق أسماء المتغيرات مع أسماء الحقول - يصبح الأمر مزعجًا. تكتب email: email وتشعر وكأنك موظف حكومي يملأ استمارة.

\n\n

الخبر السار: Rust تشعر بذلك أيضًا. وقد أوجدت حلاً.

\n\n

2. اختصار تهيئة الحقل: عندما يتطابق اسم المتغير مع الحقل

\n\n

بدءًا من Rust 1.17، يمكنك استخدام الكتابة المختصرة إذا كان اسم المتغير يتطابق مع اسم حقل الهيكل. يُسمى هذا اختصار تهيئة الحقل (field init shorthand).

\n\n
let email = String::from("someone@example.com");\nlet username = String::from("someusername123");\n\nlet user1 = User {\n    email,  // بدلاً من email: email\n    username, // بدلاً من username: username\n    active: true,\n    sign_in_count: 1,\n};
\n\n

جميل، أليس كذلك؟ Rust يفهم تلقائيًا أن email هو متغير وحقل في نفس الوقت. هذه الطريقة مفيدة بشكل خاص عند تمرير معاملات دالة تم تسميتها بشكل ذي معنى.

\n\n

متى تستخدم: دائمًا عندما يتطابق اسم المتغير مع اسم الحقل. هذا ليس فقط "أسرع في الكتابة"، بل هو Rust بأسلوب Idiomatic.

\n\n

3. بناء جملة تحديث الهيكل: نسخ الهيكل مع التعديلات

\n\n

لنفترض أن لدينا user1 بالفعل، ونريد إنشاء user2 مع تغيير البريد الإلكتروني فقط. هل يجب علينا إعادة كتابة جميع الحقول؟ لا!

\n\n
let user2 = User {\n    email: String::from("another@example.com"),\n    ..user1  // باقي الحقول تؤخذ من user1\n};
\n\n

العامل .. هو بناء جملة تحديث الهيكل (struct update syntax). يخبر المترجم: "خذ جميع الحقول المتبقية من user1". مهم: بعد ذلك، سيتم نقل user1 جزئيًا (إذا كانت الحقول لا تطبق Copy)، لذا كن حذرًا مع الملكية.

\n\n

هذا التركيب النحوي يوفر الكثير من الأسطر عند العمل مع تهيئة هياكل Rust بناءً على بيانات موجودة.

\n\n

4. خاصية Default: التهيئة بالقيم الافتراضية

\n\n

ماذا لو كانت معظم الحقول يجب أن تحتوي على قيم افتراضية؟ على سبيل المثال، active: true و sign_in_count: 0؟ يمكنك تطبيق خاصية Default:

\n\n
#[derive(Default)]\nstruct User {\n    username: String,\n    email: String,\n    active: bool,\n    sign_in_count: u64,\n}\n\n// الآن:\nlet user_default = User::default();\n// username: "", email: "", active: false, sign_in_count: 0
\n\n

لكن مهلاً!

المدونات

توصيات الكتب