0Pricing
Lua Academy · Pelajaran

Mendefinisikan dan Memanggil Fungsi

Pelajari sintaks deklarasi fungsi, konvensi pemanggilan, serta fungsi lokal dan global.

Mendefinisikan dan Memanggil Fungsi adalah pelajaran Lua Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Lua Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Lua Academy mencakup 4 pelajaran total.

Sintaks Fungsi

Fungsi dalam Lua didefinisikan dengan kata kunci function. Isinya berupa blok yang diakhiri oleh end. Fungsi dapat bersifat global atau lokal. Anda memanggil fungsi dengan menambahkan tanda kurung berisi argumen. Jika argumen dihilangkan, parameter yang tidak diisi menerima nil.

function sayHello(name)
  print("Hello, " .. (name or "World") .. "!")
end

sayHello("Lua")   -- Hello, Lua!
sayHello()        -- Hello, World!

local function add(a, b)
  return a + b
end
print(add(3, 4))  -- 7

Nilai Kembalian

Fungsi mengembalikan nilai dengan return. Berbeda dari kebanyakan bahasa, fungsi Lua dapat mengembalikan beberapa nilai. Jika tidak mengembalikan nilai secara eksplisit, fungsi tidak mengembalikan apa pun (nol nilai). Nilai kembalian berlebih dibuang saat pemanggilan bukan merupakan ekspresi terakhir dalam suatu daftar.

local function minMax(t)
  local lo, hi = t[1], t[1]
  for i = 2, #t do
    if t[i] < lo then lo = t[i] end
    if t[i] > hi then hi = t[i] end
  end
  return lo, hi
end

local lo, hi = minMax({5,2,8,1,9})
print(lo, hi)  -- 1  9

Fungsi sebagai Nilai

Fungsi adalah nilai kelas satu dalam Lua. Anda dapat menyimpannya dalam variabel, meneruskannya sebagai argumen ke fungsi lain, dan mengembalikannya. Hal ini memungkinkan panggilan balik, fungsi tingkat tinggi, dan pola pemrograman fungsional.

local ops = {
  add = function(a, b) return a + b end,
  sub = function(a, b) return a - b end,
  mul = function(a, b) return a * b end,
}

local function apply(op, a, b)
  return op(a, b)
end

print(apply(ops.add, 10, 3))  -- 13
print(apply(ops.mul, 4, 5))   -- 20

Fungsi Lokal dan Global

Gunakan local function untuk fungsi pembantu yang hanya digunakan di dalam modul. Fungsi global mengotori ruang nama global dan dapat diakses dari mana saja, sehingga dapat menyebabkan konflik nama. Dalam kebanyakan kasus, utamakan fungsi lokal dan hanya tampilkan hal yang diperlukan melalui tabel modul.

-- Bad: pollutes global namespace
function helper() end

-- Good: module-local
local function helper()
  return "I am local"
end

-- Module export pattern
local M = {}
function M.publicFunc()
  return helper()  -- can call local
end
return M

Metode dengan Sintaks Titik Dua

Lua menyediakan sintaks singkat untuk mendefinisikan dan memanggil metode pada tabel. obj:method(arg) setara dengan obj.method(obj, arg). Bentuk titik dua secara implisit meneruskan tabel sebagai argumen pertama, yang secara konvensional dinamai self.

local Dog = {}
Dog.__index = Dog

function Dog.new(name)
  return setmetatable({name=name}, Dog)
end

function Dog:speak()
  print(self.name .. " says: Woof!")
end

local d = Dog.new("Rex")
d:speak()   -- Rex says: Woof!

Pola Parameter Opsional

Lua tidak memiliki parameter opsional bawaan, tetapi Anda dapat menyimulasikannya dengan pemeriksaan nil. Teruskan satu tabel opsi untuk fungsi dengan banyak parameter opsional—cara ini lebih rapi daripada daftar argumen yang panjang.

local function createUser(name, opts)
  opts = opts or {}
  return {
    name = name,
    role = opts.role or "user",
    active = opts.active ~= false,
    score = opts.score or 0,
  }
end

local u = createUser("Alice", {role="admin", score=100})
print(u.name, u.role, u.score)

Pemanggilan Ekor

Pemanggilan ekor adalah pemanggilan fungsi pada posisi ekor (tindakan terakhir sebelum mengembalikan nilai). Lua melakukan optimisasi pemanggilan ekor: pemanggilan ekor yang benar tidak menggunakan ruang tumpukan tambahan. Hal ini memungkinkan rekursi yang dalam tanpa luapan tumpukan jika pemanggilan rekursif berada pada posisi ekor.

local function factorial(n, acc)
  acc = acc or 1
  if n <= 1 then return acc end
  return factorial(n - 1, n * acc)  -- tail call!
end

print(factorial(10))  -- 3628800
-- Can handle very large n without stack overflow

Fungsi yang Segera Dipanggil

Anda dapat mendefinisikan dan memanggil fungsi segera: (function() ... end)(). Hal ini berguna untuk membuat lingkup lokal, menjalankan kode penyiapan tepat sekali, atau mencegah variabel sementara mengotori lingkup luar.

local result = (function()
  local temp = 100
  local adjusted = temp * 1.5
  return math.floor(adjusted)
end)()

print(result)   -- 150
-- temp and adjusted not visible here

Menyimpan Fungsi dalam Tabel

Menyimpan fungsi dalam tabel merupakan pola idiomatis untuk merancang modul Lua. Tabel tersebut berperan sebagai ruang nama. Anda mendefinisikan fungsi dengan menetapkannya ke bidang tabel atau menggunakan notasi titik atau titik dua bersama nama tabel.

local math2 = {}

function math2.clamp(val, lo, hi)
  return math.max(lo, math.min(hi, val))
end

function math2.lerp(a, b, t)
  return a + (b - a) * t
end

print(math2.clamp(150, 0, 100))  -- 100
print(math2.lerp(0, 10, 0.5))   -- 5.0

Fungsi Penutup sebagai Panggilan Balik

Fungsi tingkat tinggi menerima fungsi panggilan balik. Dalam Lua, panggilan balik hanyalah nilai fungsi. Fungsi penutup sangat berguna sebagai panggilan balik karena menangkap konteks pemanggilan tanpa perlu meneruskan argumen tambahan melalui fungsi tingkat tinggi.

local function forEach(t, fn)
  for i, v in ipairs(t) do
    fn(v, i)
  end
end

local sum = 0
forEach({10, 20, 30}, function(v)
  sum = sum + v
end)
print(sum)   -- 60

forEach({"a","b","c"}, function(v, i)
  print(i, v)
end)

Pemeriksaan Singkat

Apa keluaran dari: local function f() return 1, 2, 3 end; local a, b = f()?

Ringkasan: Fungsi

Poin-poin penting:

  • Gunakan local function agar tidak mengotori variabel global
  • Fungsi adalah nilai kelas pertama: simpan dalam variabel, tabel, dan teruskan sebagai argumen
  • Sintaks titik dua secara implisit meneruskan self
  • Simulasikan parameter opsional dengan opts or {}
  • Pemanggilan ekor mencegah luapan tumpukan pada rekursi yang dalam
  • Fungsi yang langsung dipanggil membuat cakupan yang terisolasi

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Mendefinisikan dan Memanggil Fungsi” gratis?

Ya — teks lengkap “Mendefinisikan dan Memanggil Fungsi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Lua Academy, upgrade ke CoddyKit PRO. Kursus Lua Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Mendefinisikan dan Memanggil Fungsi”?

Pelajari sintaks deklarasi fungsi, konvensi pemanggilan, serta fungsi lokal dan global. Kamu berlatih Lua Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Lua Academy?

Tidak diperlukan pengalaman sebelumnya. Lua Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Mendefinisikan dan Memanggil Fungsi” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Lua Academy ini?

Ya. Setiap pelajaran Lua Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Mendefinisikan dan Memanggil Fungsi
  2. Beberapa Nilai Kembalian
  3. Vararg dan Operator ...
  4. Rekursi dalam Lua
← Kembali ke Lua Academy