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

ورقة مراجعة Luau

أوضاع التحقق من الأنواع

تعليق في أول سطر من الملف يحدّد مدى صرامة تحقق Luau.

الوضعالصياغة
بلا تحقق من الأنواع--!nocheck
الافتراضي: يتحقق مما وضعت له تعليقًا--!nonstrict
صارم: يستنتج ويتحقق من كل شيء--!strict
تشغيل ملفluau main.luau
التحقق من الأنواع دون تشغيلluau-analyze main.luau
تعطيل تحذير واحد من المدقّق--!nolint UnknownGlobal

الأنواع الأساسية

الأنواع الأولية وكيفية وضع تعليق على متغيّر.

العمليةالصياغة
رقمlocal age: number = 25
نصlocal name: string = "Ada"
قيمة منطقيةlocal ok: boolean = true
اختياري (قد يكون nil)local nick: string? = nil
any (بلا تحقق)local x: any = f()
unknown (بديل أكثر أمانًا لـ any)local x: unknown = f()
never (يرمي خطأً دائمًا)function fail(): never error("boom") end
nillocal n: nil = nil
كوروتين / bufferlocal co: thread, local b: buffer
مستنتج - بلا تعليقlocal hp = 100 -- number

جداول مُنمّطة: مصفوفات وخرائط

تبقى جداول Lua نفسها - النوع يخبرك فقط بما داخلها.

العمليةالصياغة
مصفوفة أرقامlocal xs: {number} = {1, 2, 3}
مصفوفة نصوصlocal names: {string} = {}
خريطة (مفاتيح نصية)local ages: {[string]: number} = {}
خريطة (أي نوع مفتاح)local seen: {[Player]: boolean} = {}
مصفوفة متداخلةlocal grid: {{number}} = {}
مصفوفة أشكالlocal items: {{id: number}} = {}
مصفوفة للقراءة فقطlocal t = table.freeze({1, 2, 3})
تكرار (مُعمّم، خاص بـ Luau)for i, v in xs do print(i, v) end
المرور على المفاتيح والقيمfor k, v in pairs(ages) do end

الدوال

ضع تعليقًا للمعاملات ونوع الإرجاع؛ و-> () تعني أنها لا تُرجع شيئًا.

العمليةالصياغة
معاملات ونوع إرجاع مُنمّطةfunction add(a: number, b: number): number
لا تُرجع شيئًاfunction log(msg: string): () end
إرجاع متعددfunction split(s: string): (string, string)
معامل اختياريfunction greet(name: string?) end
قيمة افتراضيةfunction greet(name: string?) name = name or "friend" end
عدد معاملات متغيّرfunction sum(...: number): number end
دالة مجهولةlocal f = function(x: number): number return x * 2 end
نوع دالةtype Adder = (number, number) -> number
معامل استدعاء راجعfunction each(f: (number) -> ()) end

أسماء الأنواع البديلة والاتحادات والحرفية

سمِّ النوع مرة واحدة واستخدمه في كل مكان.

العمليةالصياغة
اسم بديل لنوع أوليtype Health = number
اتحادtype Id = number | string
الاختياري = اتحاد مع niltype Maybe = string | nil -- same as string?
نوع حرفي (مفرد)type Dir = "up" | "down"
تقاطعtype Both = Named & Aged
اسم بديل عامtype List<T> = {T}
التصدير من وحدةexport type Point = { x: number, y: number }
نوع قيمة موجودةtype Config = typeof(config)
مفاتيح نوع جدولtype K = keyof<Point>

أشكال الجداول والدوال الأعضاء

وصف الكائنات، وself التي تأتي مع الاستدعاء بالنقطتين.

العمليةالصياغة
شكل مباشرlocal p: { x: number, y: number } = { x = 0, y = 0 }
شكل مُسمّىtype Point = { x: number, y: number }
خاصية اختياريةtype User = { name: string, age: number? }
شكل + مُفهرِسtype Bag = { count: number, [string]: any }
توسيع شكلtype Admin = User & { level: number }
دالة عضو (اختصار النقطتين)function Point.move(self: Point, dx: number) end
دالة عضو داخل نوعtype Point = { move: (self: Point, dx: number) -> () }
نمط المُنشئfunction Point.new(x: number): Point end
ثوابت مجمّدة (بديل التعداد)local Color = table.freeze({ Red = 1, Blue = 2 })

الأنواع العامة

دالة واحدة أو نوع واحد يعمل مع أنواع قيم كثيرة.

العمليةالصياغة
دالة عامةfunction id<T>(x: T): T return x end
معاملان للنوعfunction pair<A, B>(a: A, b: B): (A, B) end
عامة على مصفوفةfunction first<T>(xs: {T}): T? return xs[1] end
اسم بديل عام لنوعtype Stack<T> = { items: {T} }
تخصيص الاسم البديلlocal s: Stack<string> = { items = {} }
دالة map عامةfunction map<T, U>(xs: {T}, f: (T) -> U): {U} end
حزمة عامة (متغيّرة)function call<T...>(f: () -> T...): T... end

التضييق والتحويلات والحُرّاس

إقناع مدقّق الأنواع بأن القيمة هي ما تعرفه أنت.

العمليةالصياغة
تحويل نوع (cast)local n = value :: number
تحويل عبر anylocal n = (value :: any) :: number
تضييق بـ typeofif typeof(x) == "string" then -- x is string end
تضييق قيمة اختياريةif name then print(#name) end
إرجاع مبكر عند nilif not name then return end
تضييق اتحاد حرفيif dir == "up" then end
تحقق في وقت التشغيلassert(typeof(id) == "number", "id must be a number")
التأكد من أنها ليست nil ثم استخدامهاlocal item = assert(find(id), "missing item")

معاملات وصياغة لا توجد في Lua

تسهيلات الاستخدام اليومي - هنا يتوقف كود Luau عن أن يبدو كـ Lua.

العمليةالصياغة
الجمع مع الإسنادhp += 10
الطرح / الضرب / القسمةhp -= 5, dmg *= 2, dmg /= 2
القسمة الصحيحة مع الإسنادn //= 2
باقي القسمة / الأس مع الإسنادn %= 3, n ^= 2
الدمج مع الإسنادmsg ..= "!"
قسمة صحيحةlocal half = 7 // 2 -- 3
دمج النصوصHello, {name}! You have {n} items. (ضعها بين علامتي backtick)
إدراج تعبيرTotal: {price * qty} (ضعها بين علامتي backtick)
متابعة الحلقةfor _, v in xs do if v < 0 then continue end end
تعبير if-then-elselocal label = if hp > 0 then "alive" else "dead"
تعبير else-if متسلسلlocal t = if n > 0 then "pos" elseif n < 0 then "neg" else "zero"
أعداد ثنائية / بفواصل0b1010, 1_000_000

إضافات المكتبة والفروق عن Lua

دوال تضيفها Luau إلى المكتبة القياسية، وميزات Lua التي تحذفها.

العنصرالتفصيل
إيجاد قيمة في مصفوفةtable.find(xs, 42) -- الفهرس أو nil
نسخة سطحيةlocal copy = table.clone(t)
جعله غير قابل للتغيير / التحققtable.freeze(t), table.isfrozen(t)
تخصيص مصفوفة مسبقًاtable.create(10, 0)
clamp / round / signmath.clamp(x, 0, 1), math.round(x), math.sign(x)
عمليات البِتّاتbit32.band(a, b), bit32.lshift(a, 1)
محذوف لأغراض العزلio, package, loadstring, loadfile, dofile
مهمل لكنه موجودgetfenv وsetfenv (تعطّلان التحسينات)
غير موجود في Luaugoto / العناوين (Luau مبنية على Lua 5.1)
قراءة stdin على Coddyio.read() تعمل هنا - Coddy تعيدها فوق Luau
امتداد الملفmain.luau (.lua تعمل أيضًا)
خاص بـ Roblox وليس Luau الأساسيةgame, workspace, Instance.new, task.wait

Luau هي Lua 5.1 مع نظام تدريجي للأنواع - اللغة التي أنشأتها Roblox وأتاحتها كمصدر مفتوح. تغطي هذه الورقة ما *ليس* Lua عادية: تعليقات الأنواع، والجداول المُنمّطة، والاتحادات والأنواع الحرفية، والأنواع العامة، وتحويلات الأنواع، والتسهيلات الصياغية التي تضيفها Luau (+=، ودمج النصوص، وcontinue، وتعبيرات if-then-else). ولكل ما تتشاركه اللغتان - الجداول، والجداول الوصفية، والكوروتينات، ومكتبة النصوص - أبقِ ورقة مراجعة Lua مفتوحة بجانبها.

كل ما هنا Luau قياسية، تعمل بأداة luau ويمكن التحقق من أنواعها بـ luau-analyze. انسخ ما تحتاجه أو جرّبه مباشرة في ساحة Luau - بلا أي تثبيت. تبدأ مع نظام الأنواع من الصفر؟ دورة Luau التفاعلية المجانية من Coddy تبنيه درسًا بدرس.

أسئلة شائعة عن ورقة مراجعة Luau

هل ورقة مراجعة Luau هذه مجانية؟
نعم. هي مجانية تمامًا ولا تحتاج إلى تسجيل. أضفها إلى المفضلة لتعود إليها عندما تحتاج صياغة اتحاد أو نوع عام أو جدول مُنمّط.
هل يوجد المعامل += في Luau؟
نعم. بخلاف Lua العادية، تدعم Luau الإسناد المركّب: += و-= و*= و/= و//= و%= و^= و..= لدمج النصوص. لذا hp += 10 صياغة صحيحة في Luau (وكود Roblox صحيح)، أما في Lua 5.1 فعليك كتابة hp = hp + 10. ولاحظ أنه لا يوجد ++ ولا -- في Luau.
ما الفرق بين Lua وLuau؟
Luau مجموعة شاملة لـ Lua 5.1 مع نظام تدريجي للأنواع. وفوق الأنواع تضيف دمج النصوص بعلامات backtick، ومعاملات الإسناد المركّب، وcontinue، وتعبيرات if-then-else، والقسمة الصحيحة //، والتكرار المُعمّم (for i, v in t do)، ودوالًا مثل table.find وtable.clone وtable.freeze. ولأغراض العزل تحذف loadstring وloadfile وdofile ومكتبتي io وpackage، ولا يوجد فيها goto لأنها مبنية على 5.1. ومعظم كود Lua العادي يعمل كما هو بصفته Luau.
كيف أُشغّل التحقق من الأنواع في Luau؟
ضع تعليق وضع في أول سطر من الملف: --!strict يتحقق من كل شيء ويستنتج بقوة، و--!nonstrict (الافتراضي) يتحقق فقط مما وضعت له تعليقًا، و--!nocheck يعطّل التحقق. وخارج المحرر، نفّذ luau-analyze main.luau للتحقق دون تشغيل، وluau main.luau للتشغيل.
هل أكتب interface في Luau كما في TypeScript؟
لا - لا توجد كلمة interface في Luau. تُكتب أشكال الكائنات كأنواع جداول وتُسمّى بـ type: type User = { name: string, age: number? }. ادمج الأشكال بـ & بدلًا من extends، واستخدم export type لإتاحتها لوحدات أخرى.
هل هذه الورقة هي نفسها برمجة Roblox؟
كل ما هنا Luau الأساسية - أي اللغة - فينطبق على سكربتات Roblox وعلى Luau المستقلة سواء. وما *ليس* موجودًا هنا هو واجهة محرك Roblox (game وworkspace وInstance.new والخدمات والأحداث)، وهي مكتبة فوق اللغة توثّقها Roblox لا Luau.
أين أشغّل مقاطع Luau هذه؟
في ساحة Luau - تُشغّل مفسّر luau الحقيقي في متصفحك مع دعم stdin، فتلصق أي صف من هذه الصفحة وتضغط تشغيل. وللتدريب المنظّم، تغطي دورة Luau التفاعلية المادة نفسها بتمارين ومشاريع وشهادة.
Coddy programming languages illustration

تعلّم Luau مع Coddy

ابدأ الآن