פונקציות עם מספר משתנה של ארגומנטים (...)
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-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 שמקבלת מספר כלשהו של ארגומנטים מספריים ומחזירה את הממוצע שלהם.
השתמשו בתחביר וריאדי ... כדי לקבל מספר גמיש של ארגומנטים, לארוז אותם בטבלה, לחשב את הסכום שלהם ולחלק במספרם.
הערה: קוד הפתיחה (שמסומן "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
local average = calculateAverage(unpack(numbers))
print("Average: " .. average)
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
1איטרציה מתקדמת בטבלאות
איטרציה באמצעות pairs()איטרציה באמצעות ipairs()pairs() לעומת ipairs()סיכום – גיליון דמות2פונקציות נוספות של ספריית הטבלאות
table.concat()בניית טבלה ו־unpack()table.sort()מיון מותאם אישית באמצעות פונקציותסיכום – לוח שיאים3מושגים מתקדמים בפונקציות
החזרת ערכים מרוביםפונקציות עם מספר משתנה של ארגומנטים (...)פונקציות כערכים ממדרגה ראשונהפונקציות אנונימיותמהי סגירה (Closure)?סיכום – מטפל אירועים פשוטתרגלו בעצמכם: קומפיילר Lua אונליין