Menu
CoddyTech

Self والدوال المسبوقة بنقطتين (Colon Methods)

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

تنجح كتابة rect.area(rect)، لكنك تعلمت طريقة أفضل في درس البرمجة كائنية التوجه في Lua: النقطتان. إن rect:area() هو الاستدعاء نفسه تمامًا: تمرر Lua الجدول الذي يسبق النقطتين بوصفه الوسيط الأول، أي self، تلقائيًا.

وتفيد النقطتان أيضًا في موضع التعريف. فالتعليمة function account:deposit(amount) تعلن لك عن وسيط أول مخفي اسمه self:

type Account = {
    owner: string,
    balance: number,
    deposit: (self: Account, amount: number) -> (),
    getBalance: (self: Account) -> number,
}

local account = {owner = "Maya", balance = 1500}

function account:deposit(amount: number)
    self.balance += amount -- يُمرَّر self ضمنيًا
end

function account:getBalance(): number
    return self.balance
end

لاحظ أن تعريف الشكل يذكر self صراحةً، في deposit: (self: Account, amount: number) -> ()، مع أن النقطتين تخفيانه في التنفيذ. النقطتان مجرد صياغة مختصرة؛ فالوسيط موجود، ويصرّح به النوع. وتُكتب دالة الأسلوب التي لا تُرجع شيئًا بنوع الإرجاع الفارغ -> ().

يتبع الاستدعاء القاعدة نفسها التي تعرفها بالفعل: account:deposit(250) مطابق لـ account.deposit(account, 250). والسلوك وقت التشغيل هو نفسه كما في فصل البرمجة كائنية التوجه: تضيف Luau الأنواع فحسب.

لاحظ أن account نفسه تُرك بلا تصريح نوع. يصف النوع Account الجدول المكتمل، ولا يطابقه الجدول إلا بعد إرفاق الأسلوبين به؛ لذا فإن كتابة local account: Account = {owner = "Maya", balance = 1500} ستجعل الوضع الصارم يبلغ عن الأسلوبين المفقودين.

challenge icon

التحدي

سهل

أضِف طريقتين إلى حساب باستخدام صيغة النقطتين.

  1. أسفل الجدول، عرّف function account:deposit(amount: number) بحيث تضيف amount إلى self.balance.
  2. عرّف function account:getBalance(): number بحيث تُعيد self.balance.
  3. اطبع account:getBalance()، واستدعِ account:deposit(120)، ثم اطبع account:getBalance() مرة أخرى.

اضغط على Run Code: يُظهر الناتج 300، ثم 420.

جرّب بنفسك

type Account = {
    owner: string,
    balance: number,
    deposit: (self: Account, amount: number) -> (),
    getBalance: (self: Account) -> number,
}

local account = {owner = "Noah", balance = 300}

-- 1) function account:deposit(amount: number)
-- 2) function account:getBalance(): number
-- 3) اطبع الرصيد، وأودع 120، ثم اطبعه مرة أخرى

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

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