مقدمة: لماذا تهيئة الهياكل في Rust ليست مملة؟
\n\nإذا كنت قد كتبت بلغة Rust من قبل، فمن المؤكد أنك واجهت لحظة أردت فيها أن تقول: "لماذا يجب عليّ كتابة field: field مرارًا وتكرارًا؟ هذا واضح!"
نعم، Rust لغة صارمة، دقيقة ومعبرة بشكل لا يصدق. ولكن حتى فيها مكان للسكر النحوي الذي يجعل الكود أقصر وأنظف وأكثر متعة للعين. خاصة فيما يتعلق بـ تهيئة الهياكل - تلك الروتينية التي نقوم بها عشرات المرات في اليوم.
\n\nفي هذه المقالة، لن نجيب فقط على السؤال الشائع من Stack Overflow: "هل هناك طريقة أسرع/أقصر لتهيئة المتغيرات في هيكل Rust؟". بل سنشرح جميع الطرق - من الأساسية إلى المتقدمة - ونوضح كيفية كتابة كود سريع وقابل للقراءة و"على طريقة Rust" (idiomatic Rust).
\n\nهل أنت مستعد لتسريع عملك مع هياكل Rust؟ لنبدأ!
\n\n1. الطريقة التقليدية: تسمية الحقول بشكل صريح
\n\nلنبدأ بالأساسيات. لنفترض أن لدينا هيكل User:
struct User {\n username: String,\n email: String,\n sign_in_count: u64,\n active: bool,\n}\n\nالتهيئة القياسية تبدو كالتالي:
\n\nlet 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 وتشعر وكأنك موظف حكومي يملأ استمارة.
الخبر السار: Rust تشعر بذلك أيضًا. وقد أوجدت حلاً.
\n\n2. اختصار تهيئة الحقل: عندما يتطابق اسم المتغير مع الحقل
\n\nبدءًا من Rust 1.17، يمكنك استخدام الكتابة المختصرة إذا كان اسم المتغير يتطابق مع اسم حقل الهيكل. يُسمى هذا اختصار تهيئة الحقل (field init shorthand).
\n\nlet 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 هو متغير وحقل في نفس الوقت. هذه الطريقة مفيدة بشكل خاص عند تمرير معاملات دالة تم تسميتها بشكل ذي معنى.
متى تستخدم: دائمًا عندما يتطابق اسم المتغير مع اسم الحقل. هذا ليس فقط "أسرع في الكتابة"، بل هو Rust بأسلوب Idiomatic.
\n\n3. بناء جملة تحديث الهيكل: نسخ الهيكل مع التعديلات
\n\nلنفترض أن لدينا user1 بالفعل، ونريد إنشاء user2 مع تغيير البريد الإلكتروني فقط. هل يجب علينا إعادة كتابة جميع الحقول؟ لا!
let user2 = User {\n email: String::from("another@example.com"),\n ..user1 // باقي الحقول تؤخذ من user1\n};\n\nالعامل .. هو بناء جملة تحديث الهيكل (struct update syntax). يخبر المترجم: "خذ جميع الحقول المتبقية من user1". مهم: بعد ذلك، سيتم نقل user1 جزئيًا (إذا كانت الحقول لا تطبق Copy)، لذا كن حذرًا مع الملكية.
هذا التركيب النحوي يوفر الكثير من الأسطر عند العمل مع تهيئة هياكل Rust بناءً على بيانات موجودة.
\n\n4. خاصية Default: التهيئة بالقيم الافتراضية
\n\nماذا لو كانت معظم الحقول يجب أن تحتوي على قيم افتراضية؟ على سبيل المثال، active: true و sign_in_count: 0؟ يمكنك تطبيق خاصية Default:
#[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لكن مهلاً!
المدونات
توصيات الكتب
اقرأ أيضًا