Menu
CoddyTech

سلامة القيم الفارغة في الوضع الصارم

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

أكثر أعطال 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 حتى نهاية النطاق، وفي وقت التشغيل يتسبب التأكيد في تعطل البرنامج مبكرًا، عند موضع الافتراض الخاطئ، بدلًا من حدوث ذلك في مكان بعيد.

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

challenge icon

التحدي

سهل

أعطِ اسمًا قد يحتاج إلى قيمة احتياطية آمنة.

  1. أبقِ --!strict في السطر الأول.
  2. اكتب local function getDisplayName(fullName: string?): string لإرجاع fullName عندما لا تكون nil، وإلا فأرجع "Anonymous User".
  3. اطبع getDisplayName("John Smith") وgetDisplayName(nil).

اضغط على Run Code: يُظهر الناتج John Smith وAnonymous User.

جرّب بنفسك

--!strict
-- 1) getDisplayName(fullName: string?): string، مع استخدام "Anonymous User" كقيمة بديلة
-- 2) اطبع الناتج عند استخدام "John Smith" وnil

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

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