Menu
CoddyTech

الإجابة عن استفسارات العناصر

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

challenge icon

التحدي

متوسط

أجب عن لاعب يسأل عن عنصر واحد.

  1. احذف الأسطر الموجودة أسفل -- Try it.
  2. أسفل ذلك، اقرأ local category = io.read() وlocal id: number = tonumber(io.read()) or 0.
  3. إذا كانت القيمة "weapon"، فاطبع describeWeapon(item) للعنصر الناتج عن findItem(weapons, id)؛ وإلا فاستخدم potions وdescribePotion.
  4. اطبع Item not found عندما تُرجع findItem القيمة nil.

اضغط على Run Code: عند إدخال weapon و2، سترى Weapon: Fire Axe (damage 40).

جرّب بنفسك

-- البنية المشتركة للعنصر في كل قائمة جرد
type Item<T> = {
    id: number,
    name: string,
    data: T,
}
local sword: Item<{damage: number}> = {id = 1, name = "Iron Sword", data = {damage = 25}}
local potion: Item<{heal: number}> = {id = 2, name = "Health Potion", data = {heal = 40}}
-- أنشئ عنصرًا باستخدام أول id متاح، ثم خزّنه وأعِده
local function addItem<T>(inventory: {Item<T>}, name: string, data: T): Item<T>
    local item: Item<T> = {id = #inventory + 1, name = name, data = data}
    table.insert(inventory, item)
    return item
end
type Weapon = Item<{damage: number}>
type Potion = Item<{heal: number}>
local weapons: {Weapon} = {}
addItem(weapons, "Iron Sword", {damage = 25})
addItem(weapons, "Fire Axe", {damage = 40})
-- العنصر الذي يحمل هذا id، أو nil
local function findItem<T>(inventory: {Item<T>}, id: number): Item<T>?
    for _, item in ipairs(inventory) do
        if item.id == id then
            return item
        end
    end
    return nil
end
local potions: {Potion} = {}
addItem(potions, "Health Potion", {heal = 40})
-- وصف واحد لكل نوع من العناصر
local function describeWeapon(item: Weapon): string
    return `Weapon: {item.name} (damage {item.data.damage})`
end

local function describePotion(item: Potion): string
    return `Potion: {item.name} (heals {item.data.heal})`
end
-- جرّبه
print(describeWeapon(weapons[2]))
print(describePotion(potions[1]))

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

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