المراجع والاستعارة
المراجع والاستعارة
Section titled “المراجع والاستعارة”المراجع تسمح بالوصول للبيانات بدون نقل الملكية، مما يحسن الأداء ويمنع نسخ البيانات غير الضروري.
المراجع الثابتة
Section titled “المراجع الثابتة”مرجع ثابت يسمح بالقراءة فقط:
دالة اطبع_القيمة(قيمة: &ص64) { اطبع("القيمة: "); اطبع_صحيح(*قيمة); // * لإلغاء المرجع}
دع عدد = 42;اطبع_القيمة(&عدد); // & لإنشاء مرجععدة مراجع ثابتة
Section titled “عدة مراجع ثابتة”يمكن إنشاء عدة مراجع ثابتة في نفس الوقت:
دع عدد = 42;
دع اشارة1 = &عدد;دع اشارة2 = &عدد;
اطبع_صحيح(*اشارة1); // 42اطبع_صحيح(*اشارة2); // 42المراجع المتغيرة
Section titled “المراجع المتغيرة”مرجع متغير يسمح بالقراءة والكتابة:
دالة زد_القيمة(قيمة: &متغير ص64) { *قيمة = *قيمة + 1;}
دع متغير رقم: ص64 = 10;اطبع_صحيح(رقم); // 10
زد_القيمة(&متغير رقم);اطبع_صحيح(رقم); // 11مراجع الهياكل
Section titled “مراجع الهياكل”مرجع ثابت لهيكل
Section titled “مرجع ثابت لهيكل”هيكل عداد { قيمة: ص64,}
دالة اعرض_عداد(ع: &عداد) { اطبع_صحيح(ع.قيمة);}
دع عد = عداد { قيمة: 100 };اعرض_عداد(&عد);تعديل حقول الهيكل
Section titled “تعديل حقول الهيكل”دع متغير عد = عداد { قيمة: 100 };عد.قيمة = عد.قيمة + 50;اطبع_صحيح(عد.قيمة); // 150قواعد الاستعارة
Section titled “قواعد الاستعارة”- المراجع الثابتة: يمكن وجود عدة مراجع ثابتة
- المراجع المتغيرة: مرجع متغير واحد فقط
- لا خلط: لا يمكن خلط المراجع الثابتة والمتغيرة
دع متغير عدد = 10;
// ✓ صحيح: عدة مراجع ثابتةدع م1 = &عدد;دع م2 = &عدد;
// ✓ صحيح: مرجع متغير واحد (بعد انتهاء الثابتة)دع م3 = &متغير عدد;التحقق من العمر (Lifetime Validation)
Section titled “التحقق من العمر (Lifetime Validation)”كشف المراجع المتدلية
Section titled “كشف المراجع المتدلية”لا يمكن إرجاع مرجع لمتغير محلي من دالة، لأن المتغير سيُدمّر عند انتهاء الدالة:
// ✗ خطأ: مرجع متدلي — المتغير المحلي سيُدمّردالة خطأ_مرجع() -> &صحيح { دع محلي = 42; أرجع &محلي; // ⚠️ تحذير: إرجاع مرجع لمتغير محلي}
// ✓ صحيح: إرجاع مرجع لمعامل الدالةدالة صحيح_مرجع(بيانات: &صحيح) -> &صحيح { أرجع بيانات; // ✓ المعامل يعيش خارج الدالة}
// ✓ صحيح: إرجاع قيمة مملوكة بدلاً من مرجعدالة آمن() -> صحيح { دع محلي = 42; أرجع محلي; // ✓ نسخة القيمة}التحقق من عمر النطاقات
Section titled “التحقق من عمر النطاقات”المراجع لا يمكنها العيش أكثر من البيانات التي تشير إليها:
دالة اختبار_نطاقات() { دع متغير بيانات = 100;
// نطاق داخلي: الاستعارة تعيش فقط داخل النطاق { دع م = &بيانات; اطبع("القراءة:", *م); } // بعد انتهاء النطاق، يمكن التعديل بيانات = 200; اطبع("القيمة الجديدة:", بيانات);}أنواع النسخ (Copy Types)
Section titled “أنواع النسخ (Copy Types)”الأنواع البسيطة (صحيح، عشري، منطقي، حرف) تُنسخ تلقائياً عند الإسناد:
دع أ = 5;دع ب = أ; // نسخة — أ لا يزال صالحاًاطبع("أ:", أ);اطبع("ب:", ب);المثال الكامل
Section titled “المثال الكامل”// دالة تأخذ مرجع ثابتدالة اطبع_القيمة(قيمة: &ص64) { اطبع("القيمة: "); اطبع_صحيح(*قيمة);}
// دالة تأخذ مرجع متغيردالة زد_القيمة(قيمة: &متغير ص64) { *قيمة = *قيمة + 1;}
// هيكل للاختبارهيكل عداد { قيمة: ص64,}
دالة رئيسية() -> صحيح { اطبع("=== المراجع والاستعارة ===");
// مراجع ثابتة اطبع("=== مراجع ثابتة ==="); دع عدد = 42; اطبع_القيمة(&عدد);
// عدة مراجع ثابتة دع اشارة1 = &عدد; دع اشارة2 = &عدد; اطبع("من المرجع الأول: "); اطبع_صحيح(*اشارة1); اطبع("من المرجع الثاني: "); اطبع_صحيح(*اشارة2);
// مراجع متغيرة اطبع("=== مراجع متغيرة ==="); دع متغير رقم: ص64 = 10; اطبع("قبل الزيادة: "); اطبع_صحيح(رقم);
زد_القيمة(&متغير رقم); اطبع("بعد الزيادة: "); اطبع_صحيح(رقم);
// مراجع الهياكل اطبع("=== مراجع الهياكل ==="); دع متغير عد = عداد { قيمة: 100 }; اطبع_صحيح(عد.قيمة);
عد.قيمة = عد.قيمة + 50; اطبع("بعد الإضافة: "); اطبع_صحيح(عد.قيمة);
أرجع 0;}