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