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

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

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

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

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

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

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

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

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

challenge icon

التحدي

سهل

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

  • getDisplayName(fullName: string?): string: تُرجع fullName إذا لم تكن nil، وإلا تُرجع Anonymous User.
  • formatEmail(email: string?): string: تُرجع email بأحرف صغيرة (string.lower) إذا لم تكن nil، وإلا تُرجع No email provided.
  • getUserInfo(name: string?, email: string?): string: تستخدم الدالتين both وتُرجع 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

تدرّب بنفسك: مترجم Lua عبر الإنترنت