الدرس 10 من 10
تحويل الجدول إلى نصّ
- 15 دقيقة
- 5 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
دالة تستدعي نفسها وترتيب ثابت للمفاتيح
الشرح
لا يطبع print(save) إلا شيئًا مثل table: 0x…، وأنت تحتاج الجدول نصًّا مقروءًا لتحفظ اللعبة، أو لترى حالتها وأنت تبحث عن خطأ. ولأن الجدول قد يحوي جداول فيها جداول أخرى، فالحلّ دالة تستدعي نفسها، تحوّل القيمة البسيطة مباشرة، وتكتب كل مدخل في الجدول على شكل key = متبوعًا بناتج serialize لقيمته.
ورتّب المفاتيح قبل أن تكتبها، لأن pairs لا تضمن أي ترتيب، فإن لم ترتّبها خرجت الحالة نفسها بنصّين مختلفين من تشغيل إلى آخر، ولن تستطيع أن تقارن ملفّي حفظ أو تكتب اختبارًا يطابق النصّ. والناتج بهذا الشكل كود Lua صالح ما دامت المفاتيح النصّية أسماء عادية، فتعيده load("return " .. text)() جدولًا.
وانتبه إلى الجدول الذي يجمع مفاتيح رقمية ونصّية معًا، مثل { "سيف", gold = 50 }، فإن استعملت table.sort دون دالة مقارنة رمت الخطأ attempt to compare حين تقارن رقمًا بنصّ. لذلك اكتب دالة مقارنة تقدّم الأرقام على النصوص، وتقارن كل نوع بمثله.
المطلوب
اكتب serialize(value) لتُرجع النصّ بين علامتي تنصيص، والرقم والقيمة المنطقية كما يعطيهما tostring، والجدول بين {} ومداخله مفصولة بـ ", "، على أن يُكتب المفتاح الرقمي بالشكل [1] = والمفتاح النصّي بالشكل gold = ، وأن تأتي الأرقام أولًا تصاعديًّا ثم النصوص أبجديًّا. فيصير الجدول { "سيف", gold = 50 } هذا النصّ: {[1] = "سيف", gold = 50}.
الفحوص
5 فحوص- القيم البسيطة تُكتب صحيحة
- مفاتيح الجدول مرتّبة
- المفاتيح الرقمية بين قوسين وقبل النصّية
- الجداول المتداخلة والفارغة تُكتب صحيحة
- النصّ يعود جدولًا بـ load