الدوال متغيرة الوسائط (...)
جزء من قسم المنطق وتسلسل التنفيذ في رحلة 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التحدي
سهلاكتب دالة 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
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتسلسل التنفيذ
1التكرار المتقدم عبر الجداول
التكرار باستخدام pairs()التكرار باستخدام ipairs()pairs() مقابل ipairs()مراجعة - ورقة الشخصية2المزيد من دوال مكتبة Table
table.concat()إنشاء الجداول و unpack()table.sort()فرز مخصص باستخدام الدوالمراجعة - لوحة أعلى النتائج3مفاهيم الدوال المتقدمة
إرجاع قيم متعددةالدوال متغيرة الوسائط (...)الدوال كقيم من الدرجة الأولىالدوال المجهولةما هو الـ Closure؟ملخص - معالج أحداث بسيطتدرّب بنفسك: مترجم Lua عبر الإنترنت