Menu
CoddyTech

الدوال متغيرة الوسائط (...)

جزء من قسم المنطق وتسلسل التنفيذ في رحلة Lua على Coddy. الدرس 11 من 54.

أحيانًا تحتاج إلى دالة يمكنها التعامل مع أي عدد من الوسائط. ربما تريد حساب مجموع عددين، أو ثلاثة، أو عشرة، دون كتابة دوال منفصلة لكل حالة. توفر Lua صياغة خاصة لذلك: النقاط الثلاث ...

عندما تضع ... في قائمة معاملات دالة، تصبح دالة متغيرة الوسائط تقبل أي عدد من الوسائط:

function sum(...)
    -- جسم الدالة
end

داخل الدالة، يمكنك الوصول إلى هذه الوسائط باستخدام ... مرة أخرى. وللتعامل معها بسهولة أكبر، يمكنك تجميعها في جدول باستخدام الأقواس المعقوفة:

function sum(...)
    local args = {...}
    local total = 0
    for i = 1, #args do
        total = total + args[i]
    end
    return total
end

print(sum(5, 10, 15))  -- الناتج: 30
print(sum(1, 2, 3, 4, 5))  -- الناتج: 15

ينشئ التعبير {...} جدولًا بأسلوب القوائم يحتوي على جميع الوسيطات المُمرَّرة إلى الدالة. يمكنك بعد ذلك التكرار عبر هذا الجدول كما تفعل مع أي جدول آخر، باستخدام عامل الطول # أو ipairs().

يعمل هذا ما دام لا توجد أي وسيطة قيمتها nil. تترك القيمة nil فجوةً في الجدول، ولا يمكن الاعتماد على # مع جدول يحتوي على فجوات. تعيد select("#", ...) دائمًا عدد الوسيطات، بما فيها الوسيطات التي قيمتها nil:

function countArgs(...)
    return select("#", ...)
end

print(countArgs(10, 20, 30))        -- الناتج: 3
print(countArgs(10, nil, 30, nil))  -- الناتج: 4
challenge icon

التحدي

سهل

اكتب دالة calculateAverage تقبل أي عدد من الوسائط الرقمية وتُرجع متوسطها.

استخدم صياغة الوسائط المتغيرة ... لقبول عدد مرن من الوسائط، واجمعها في جدول، واحسب مجموعها، ثم اقسمه على العدد.

ملاحظة: يقرأ الكود التمهيدي (المميز بعبارة "Don't touch this code") الأرقام من الإدخال، ويحوّل كلًّا منها من نص إلى رقم باستخدام tonumber()، ويخزنها في جدول يُسمى numbers. في النهاية، يستدعي دالتك باستخدام unpack(numbers)، ما يمرر قيم الجدول كوسائط منفردة، لذا تستقبلها دالتك بصيغة .... لا تحتاج إلى تعديل هذا الكود أو فهمه بالتفصيل؛ ركّز فقط على كتابة calculateAverage.

المنطق:

  • اجمع كل الوسائط في جدول باستخدام {...}
  • كرّر المرور على الجدول لحساب مجموع الأرقام كلها
  • اقسم المجموع على عدد الوسائط للحصول على المتوسط
  • أعد المتوسط كرقم

المعاملات:

  • ... (أرقام): عدد متغير من الوسائط الرقمية

القيمة المُعادة: متوسط جميع الأرقام المُعطاة (رقم)

جرّب بنفسك

-- لا تعدّل هذا الكود --
local numbers = {}
while true do
    local input = io.read()
    if input == nil or input == "" then
        break
    end
    local num = tonumber(input)
    if num then
        table.insert(numbers, num)
    end
end
-------------------------

function calculateAverage(...)
    -- اكتب الكود هنا
end
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس المنطق وتسلسل التنفيذ

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