21. Fungsi — Solusi PR

File solusi .lua ada di exercises/21/homework/solutions/.

Soal 1 — Greet

Soal. Sebuah fungsi greet(name) yang mencetak salam, dipanggil tiga kali.

Cara memikirkannya. Satu parameter, satu baris print; pemanggil mengoper sebuah string setiap kali memanggil fungsi.

Solusi.

local function greet(name)
    print("Hello, " .. name .. "!")
end

greet("Keiko")
greet("Roblox")
greet("World")

Kesalahan umum.

  • Lupa menulis local. Tanpanya, greet menjadi variabel global. Tetap berjalan, tapi kebiasaan yang salah.
  • Salah menempatkan end. Setiap function butuh end yang sepadan; indentasi tubuh fungsi agar mudah dilihat.

Soal 2 — is_even

Soal. Kembalikan true atau false dari n % 2 == 0. Tidak ada print di dalam fungsi.

Cara memikirkannya. n % 2 == 0 sudah merupakan boolean. return langsung saja; biarkan pemanggil yang mencetaknya.

Solusi.

local function is_even(n)
    return n % 2 == 0
end

print(is_even(4))   -- true
print(is_even(7))   -- false
print(is_even(0))   -- true
print(is_even(-2))  -- true

Satu baris itu adalah seluruh isi fungsinya: Lua menghitung n % 2, lalu ... == 0, dan mengembalikan boolean-nya.

Kesalahan umum.

  • Menulis fungsi seperti ini:

    if n % 2 == 0 then
        return true
    else
        return false
    end

    Empat baris untuk apa yang satu baris di atas sudah lakukan. n % 2 == 0 sudah boolean.

Soal 3 — Clamp

Soal. clamp(x, lo, hi) mengembalikan x yang dibatasi oleh lo dan hi.

Cara memikirkannya. Dua pengecekan di awal menangani kasus di luar rentang; selain itu kembalikan x apa adanya.

Solusi.

local function clamp(x, lo, hi)
    if x < lo then
        return lo
    end
    if x > hi then
        return hi
    end
    return x
end

print(clamp(5, 0, 10))    -- 5
print(clamp(-3, 0, 10))   -- 0
print(clamp(99, 0, 10))   -- 10

Dua blok if bersifat independen karena masing-masing langsung return: yang pertama terpicu akan langsung keluar dari fungsi. Jika tidak ada yang terpicu, return x yang dijalankan.

Kesalahan umum.

  • Mengira clamp(99, 0, 10) hasilnya 99. Dibatasi oleh memaksa keluaran berada di dalam rentang, sehingga hasilnya 10.

Tantangan — Swap

Soal. Sebuah fungsi yang mengembalikan dua nilai dalam posisi tertukar, ditambah pemanggilan dengan multi-assignment.

Cara memikirkannya. Isi fungsinya cukup satu baris: return b, a. Pemanggil menulis x, y = swap(x, y) untuk menerima keduanya sekaligus.

Solusi.

local function swap(a, b)
    return b, a
end

local x = 1
local y = 2

print("Before: x=" .. x .. " y=" .. y)
x, y = swap(x, y)
print("After:  x=" .. x .. " y=" .. y)

Keluaran:

Before: x=1 y=2
After:  x=2 y=1

Trik a, b = b, a yang sama dari bab 11, dibungkus dalam sebuah fungsi. Tidak menambah kemampuan baru, tapi memberi operasi tersebut sebuah nama yang membuat kode pemanggil lebih jelas.

Kesalahan umum.

  • Menulis x, y = swap(x, y), 0 atau ekspresi tambahan lainnya. Pemanggilan multi-kembalian di tengah daftar dipotong menjadi satu nilai: hanya kembalian pertama yang sampai ke x, 0 diberikan ke y, kembalian kedua hilang. Agar keduanya bisa digunakan, pemanggilan fungsi harus menjadi ekspresi terakhir dalam assignment.

Selesai?

Dua bab berikutnya membahas tabel, struktur di balik segalanya mulai dari daftar hingga pohon objek Roblox. Lalu modul untuk memisahkan kode ke beberapa file, dan mini-proyek Bagian 5: petualangan berbasis teks.