الدوال متغيرة الوسائط (...)
جزء من قسم المنطق والتحكم في التدفق في رحلة 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().
التحدي
سهلاكتب دالة calculateAverage تقبل أي عدد من الوسائط الرقمية وتُرجع average الخاص بها.
استخدم الصياغة المتغيرة ... لقبول عدد مرن من الوسائط، وحزّمها في جدول، واحسب مجموعها، ثم اقسمه على العدد.
ملاحظة: يقرأ الكود الابتدائي (المحدد بعبارة "Don't touch this code") الأعداد من الإدخال، ويحوّل كل واحد منها من نص إلى عدد باستخدام tonumber()، ويخزنها في جدول يسمى numbers. وفي النهاية، يستدعي دالتك باستخدام unpack(numbers)، الذي ينشر قيم الجدول كوسائط فردية، ولذلك تستقبلها دالتك على هيئة .... لا تحتاج إلى تعديل هذا الكود أو فهمه بالتفصيل؛ ركّز فقط على كتابة calculateAverage.
المنطق:
- احزم جميع الوسائط في جدول باستخدام
{...} - كرّر عبر الجدول لحساب مجموع جميع الأعداد
- اقسم المجموع على عدد الوسائط للحصول على
average - أعد
averageكعدد
المعلمات:
...(numbers): عدد متغير من الوسائط الرقمية
القيمة المُعادة: average لجميع الأعداد المقدمة (عدد)
جرّب بنفسك
-- لا تلمس هذا الكود --
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
local average = calculateAverage(unpack(numbers))
print("Average: " .. average)
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق والتحكم في التدفق
1التكرار المتقدم عبر الجداول
التكرار باستخدام pairs()التكرار باستخدام ipairs()pairs() مقابل ipairs()مراجعة - ورقة الشخصية2المزيد من دوال مكتبة Table
table.concat()إنشاء الجداول و unpack()table.sort()فرز مخصص باستخدام الدوالمراجعة - لوحة أعلى النتائج3مفاهيم الدوال المتقدمة
إرجاع قيم متعددةالدوال متغيرة الوسائط (...)الدوال كقيم من الدرجة الأولىالدوال المجهولةما هو الـ Closure؟ملخص - معالج أحداث بسيطتدرّب بنفسك: مترجم Lua عبر الإنترنت