Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

أمان القيم الخالية (Nil) في الوضع الصارم

جزء من قسم مقدمة إلى Luau في رحلة Lua على Coddy — الدرس 71 من 73.

أكثر أسباب توقف Lua شيوعاً هو "attempt to index nil" — وهو كود يفترض وجود قيمة بينما هي غير موجودة. حل Luau هو انضباط nil: تحت وضع --!strict، لا يمكن لـ string العادي أن يكون nil على الإطلاق. إذا كان nil إمكانية واردة، فيجب أن يوضح النوع ذلك باستخدام ?:

--!صارم
local nickname: string? = nil   -- حسناً: string أو nil
local username: string = nil    -- ✗ خطأ نوع في الوضع الصارم

هذا الانضباط يعمل في الاتجاهين: عند إعطائك string?، لن يسمح لك الوضع الصارم لاستخدامه كـ string حتى تقوم بـ استبعاد nil. أداة الفحص القياسية هي المقارنة العادية، التي تقوم بالتضييق تماماً مثل حارس typeof:

local function shout(name: string?): string
    if name ~= nil then
        return string.upper(name) -- name هو string هنا
    end
    return "NOBODY"
end

عندما يكون nil خطأً برمجياً (bug) بدلاً من حالة صالحة، استخدم assert: بعد assert(x ~= nil) يتعامل الفاحص مع x كـ non-nil لباقي النطاق — وفي وقت التشغيل يتوقف البرامج بـ assert مبكراً عند نقطة الافتراض الخاطئ، بدلاً من حدوث الخطأ في مكان آخر بعيد.

الفائدة: يجبرك الفاحص على التعامل مع كل قيمة "قد تكون مفقودة" أثناء التحرير، ولا يحدث خطأ وقت التشغيل ببساطة أبداً.

challenge icon

التحدي

سهل

قم بمعالجة حقول الملف الشخصي للمستخدم التي قد تكون مفقودة. ابدأ ملفك بـ --!strict.

  • getDisplayName(fullName: string?): string — تُرجع fullName إذا لم تكن nil، وإلا تُرجع "Anonymous User".
  • formatEmail(email: string?): string — تُرجع البريد الإلكتروني بحروف صغيرة (string.lower) إذا لم يكن nil، وإلا تُرجع "No email provided".
  • getUserInfo(name: string?, email: string?): string — تستخدم كلا الدالتين وتُرجع `Name: {getDisplayName(name)}, Email: {formatEmail(email)}` (أي بالشكل Name: [processed name], Email: [processed email]).

ثم اطبع، كل منها في سطر مستقل:

  1. getDisplayName("John Smith")
  2. getDisplayName(nil)
  3. formatEmail("ALICE@EXAMPLE.COM")
  4. formatEmail(nil)
  5. getUserInfo("Bob Johnson", "bob@test.com")
  6. getUserInfo(nil, nil)
  7. getUserInfo("Sarah Wilson", nil)

جرّب بنفسك

--!strict
-- اكتب الكود هنا
-- 1) getDisplayName(fullName: string?): string — nil-check, fallback "Anonymous User"
-- 2) formatEmail(email: string?): string — string.lower or "No email provided"
-- 3) getUserInfo(name: string?, email: string?): string — ادمج كليهما
-- 4) اطبع استدعاءات الاختبار السبعة من المهمة
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس مقدمة إلى Luau