ورقة مراجعة 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 |
| nil | local n: nil = nil |
| كوروتين / buffer | local 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 |
| الاختياري = اتحاد مع nil | type 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 |
| تحويل عبر any | local n = (value :: any) :: number |
| تضييق بـ typeof | if typeof(x) == "string" then -- x is string end |
| تضييق قيمة اختيارية | if name then print(#name) end |
| إرجاع مبكر عند nil | if 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-else | local 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 / sign | math.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 (تعطّلان التحسينات) |
| غير موجود في Luau | goto / العناوين (Luau مبنية على Lua 5.1) |
| قراءة stdin على Coddy | io.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؟
+= و-= و*= و/= و//= و%= و^= و..= لدمج النصوص. لذا hp += 10 صياغة صحيحة في Luau (وكود Roblox صحيح)، أما في Lua 5.1 فعليك كتابة hp = hp + 10. ولاحظ أنه لا يوجد ++ ولا -- في Luau.ما الفرق بين Lua وLuau؟
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؟
game وworkspace وInstance.new والخدمات والأحداث)، وهي مكتبة فوق اللغة توثّقها Roblox لا Luau.أين أشغّل مقاطع Luau هذه؟
luau الحقيقي في متصفحك مع دعم stdin، فتلصق أي صف من هذه الصفحة وتضغط تشغيل. وللتدريب المنظّم، تغطي دورة Luau التفاعلية المادة نفسها بتمارين ومشاريع وشهادة.