Menu
CoddyTech

Fungsi Variadik (...)

Termasuk bagian Logika dan Alur dalam perjalanan Lua di Coddy. Pelajaran 11 dari 54.

Terkadang kamu membutuhkan fungsi yang dapat bekerja dengan berapa pun jumlah argumen. Mungkin kamu ingin menghitung jumlah dua angka, atau tiga, atau sepuluh, tanpa menulis fungsi terpisah untuk setiap kasus. Lua menyediakan sintaks khusus untuk ini: tiga titik ...

Saat kamu menempatkan ... dalam daftar parameter fungsi, fungsi tersebut menjadi fungsi variadik yang menerima argumen dalam jumlah berapa pun:

function sum(...)
    -- Isi fungsi
end

Di dalam fungsi, kamu dapat mengakses argumen ini dengan menggunakan ... lagi. Agar lebih mudah mengolahnya, kamu dapat mengemasnya ke dalam tabel menggunakan kurung kurawal:

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))  -- output: 30
print(sum(1, 2, 3, 4, 5))  -- output: 15

Ekspresi {...} membuat tabel bergaya list yang berisi semua argumen yang diteruskan ke fungsi. Kamu kemudian dapat melakukan perulangan melalui tabel ini seperti tabel lainnya, menggunakan operator panjang # atau ipairs().

Ini berfungsi selama tidak ada argumen yang bernilai nil. nil membuat celah di tabel, dan # tidak dapat diandalkan pada tabel yang memiliki celah. select("#", ...) selalu mengembalikan jumlah argumen, termasuk yang bernilai nil:

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

print(countArgs(10, 20, 30))        -- output: 3
print(countArgs(10, nil, 30, nil))  -- output: 4
challenge icon

Tantangan

Mudah

Tulis sebuah fungsi calculateAverage yang menerima sejumlah argumen numerik dan mengembalikan rata-ratanya.

Gunakan sintaks variadik ... untuk menerima jumlah argumen yang fleksibel, mengemasnya ke dalam tabel, menghitung jumlahnya, lalu membaginya dengan banyaknya argumen.

Catatan: Kode awal (ditandai "Don't touch this code") membaca angka dari input, mengonversi setiap angka dari teks menjadi angka menggunakan tonumber(), lalu menyimpannya dalam tabel bernama numbers. Pada akhirnya, kode tersebut memanggil fungsi yang kamu tulis menggunakan unpack(numbers), yang menyebarkan nilai-nilai tabel sebagai argumen satu per satu, sehingga fungsimu menerimanya sebagai .... Kamu tidak perlu mengubah atau memahami kode ini secara mendetail, cukup fokus menulis calculateAverage.

Logika:

  • Kemas semua argumen ke dalam tabel menggunakan {...}
  • Lakukan perulangan melalui tabel untuk menghitung jumlah semua angka
  • Bagi jumlahnya dengan banyaknya argumen untuk mendapatkan rata-rata
  • Kembalikan rata-rata sebagai angka

Parameter:

  • ... (angka): Sejumlah argumen numerik

Nilai yang dikembalikan: Rata-rata dari semua angka yang diberikan (angka)

Coba sendiri

-- Jangan ubah kode ini --
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(...)
    -- Tulis kode di sini
end
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Logika dan Alur

Latihan sendiri: Compiler Lua online