تخطَّ إلى المحتوى

المراجع والاستعارة

المراجع تسمح بالوصول للبيانات بدون نقل الملكية، مما يحسن الأداء ويمنع نسخ البيانات غير الضروري.

مرجع ثابت يسمح بالقراءة فقط:

دالة اطبع_القيمة(قيمة: &ص64) {
اطبع("القيمة: ");
اطبع_صحيح(*قيمة); // * لإلغاء المرجع
}
دع عدد = 42;
اطبع_القيمة(&عدد); // & لإنشاء مرجع

يمكن إنشاء عدة مراجع ثابتة في نفس الوقت:

دع عدد = 42;
دع اشارة1 = &عدد;
دع اشارة2 = &عدد;
اطبع_صحيح(*اشارة1); // 42
اطبع_صحيح(*اشارة2); // 42

مرجع متغير يسمح بالقراءة والكتابة:

دالة زد_القيمة(قيمة: &متغير ص64) {
*قيمة = *قيمة + 1;
}
دع متغير رقم: ص64 = 10;
اطبع_صحيح(رقم); // 10
زد_القيمة(&متغير رقم);
اطبع_صحيح(رقم); // 11
هيكل عداد {
قيمة: ص64,
}
دالة اعرض_عداد(ع: &عداد) {
اطبع_صحيح(ع.قيمة);
}
دع عد = عداد { قيمة: 100 };
اعرض_عداد(&عد);
دع متغير عد = عداد { قيمة: 100 };
عد.قيمة = عد.قيمة + 50;
اطبع_صحيح(عد.قيمة); // 150
  1. المراجع الثابتة: يمكن وجود عدة مراجع ثابتة
  2. المراجع المتغيرة: مرجع متغير واحد فقط
  3. لا خلط: لا يمكن خلط المراجع الثابتة والمتغيرة
دع متغير عدد = 10;
// ✓ صحيح: عدة مراجع ثابتة
دع م1 = &عدد;
دع م2 = &عدد;
// ✓ صحيح: مرجع متغير واحد (بعد انتهاء الثابتة)
دع م3 = &متغير عدد;

التحقق من العمر (Lifetime Validation)

Section titled “التحقق من العمر (Lifetime Validation)”

لا يمكن إرجاع مرجع لمتغير محلي من دالة، لأن المتغير سيُدمّر عند انتهاء الدالة:

// ✗ خطأ: مرجع متدلي — المتغير المحلي سيُدمّر
دالة خطأ_مرجع() -> &صحيح {
دع محلي = 42;
أرجع &محلي; // ⚠️ تحذير: إرجاع مرجع لمتغير محلي
}
// ✓ صحيح: إرجاع مرجع لمعامل الدالة
دالة صحيح_مرجع(بيانات: &صحيح) -> &صحيح {
أرجع بيانات; // ✓ المعامل يعيش خارج الدالة
}
// ✓ صحيح: إرجاع قيمة مملوكة بدلاً من مرجع
دالة آمن() -> صحيح {
دع محلي = 42;
أرجع محلي; // ✓ نسخة القيمة
}

المراجع لا يمكنها العيش أكثر من البيانات التي تشير إليها:

دالة اختبار_نطاقات() {
دع متغير بيانات = 100;
// نطاق داخلي: الاستعارة تعيش فقط داخل النطاق
{
دع م = &بيانات;
اطبع("القراءة:", *م);
}
// بعد انتهاء النطاق، يمكن التعديل
بيانات = 200;
اطبع("القيمة الجديدة:", بيانات);
}

الأنواع البسيطة (صحيح، عشري، منطقي، حرف) تُنسخ تلقائياً عند الإسناد:

دع أ = 5;
دع ب = أ; // نسخة — أ لا يزال صالحاً
اطبع("أ:", أ);
اطبع("ب:", ب);
// دالة تأخذ مرجع ثابت
دالة اطبع_القيمة(قيمة: &ص64) {
اطبع("القيمة: ");
اطبع_صحيح(*قيمة);
}
// دالة تأخذ مرجع متغير
دالة زد_القيمة(قيمة: &متغير ص64) {
*قيمة = *قيمة + 1;
}
// هيكل للاختبار
هيكل عداد {
قيمة: ص64,
}
دالة رئيسية() -> صحيح {
اطبع("=== المراجع والاستعارة ===");
// مراجع ثابتة
اطبع("=== مراجع ثابتة ===");
دع عدد = 42;
اطبع_القيمة(&عدد);
// عدة مراجع ثابتة
دع اشارة1 = &عدد;
دع اشارة2 = &عدد;
اطبع("من المرجع الأول: ");
اطبع_صحيح(*اشارة1);
اطبع("من المرجع الثاني: ");
اطبع_صحيح(*اشارة2);
// مراجع متغيرة
اطبع("=== مراجع متغيرة ===");
دع متغير رقم: ص64 = 10;
اطبع("قبل الزيادة: ");
اطبع_صحيح(رقم);
زد_القيمة(&متغير رقم);
اطبع("بعد الزيادة: ");
اطبع_صحيح(رقم);
// مراجع الهياكل
اطبع("=== مراجع الهياكل ===");
دع متغير عد = عداد { قيمة: 100 };
اطبع_صحيح(عد.قيمة);
عد.قيمة = عد.قيمة + 50;
اطبع("بعد الإضافة: ");
اطبع_صحيح(عد.قيمة);
أرجع 0;
}