Fungsi require
Muat modul eksternal dengan require dan pahami caching modul.
Fungsi require 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.
Cara Kerja require
require(modname) memuat dan mengembalikan sebuah modul. Fungsi ini mencari package.path untuk menemukan file .lua dan package.cpath untuk menemukan pustaka C. Hasilnya disimpan dalam cache di package.loaded[modname]—panggilan berikutnya mengembalikan nilai dari cache tanpa menjalankan ulang file.
-- First require: loads and executes math_utils.lua
local math_utils = require("math_utils")
-- Second require: returns cached value (file not re-run)
local math_utils2 = require("math_utils")
print(math_utils == math_utils2) -- true (same object)
print(package.loaded["math_utils"] == math_utils) -- trueNilai Kembalian Modul
File modul seharusnya mengembalikan sebuah nilai—biasanya tabel berisi fungsi. Nilai kembalian inilah yang diberikan require kepada pemanggil. Jika file tidak mengembalikan apa pun (atau true), itulah yang dikembalikan require.
-- mymodule.lua:
-- local M = {}
-- function M.hello() print("Hello from module!") end
-- return M
-- In main script:
local m = require("mymodule")
m.hello() -- Hello from module!
-- The module table is the interfaceCaching dalam package.loaded
package.loaded adalah tabel yang memetakan nama modul ke nilai yang telah dimuat. Anda dapat mengatur entri secara manual untuk memuat mock terlebih dahulu, atau mengaturnya menjadi nil untuk memaksa pemuatan ulang (file modul akan dijalankan kembali pada require berikutnya).
-- Force reload by clearing cache
package.loaded["mymodule"] = nil
local fresh = require("mymodule") -- re-executes the file
-- Preload a mock for testing
package.loaded["db"] = {
query = function() return {} end,
close = function() end,
}
local db = require("db") -- gets the mockFormat package.path
package.path adalah daftar pola yang dipisahkan titik koma. Placeholder ? digantikan oleh nama modul (dengan titik diganti menjadi pemisah jalur). Anda dapat menambahkan direktori pencarian dengan menempatkannya di awal package.path.
print(package.path)
-- typically: ./?.lua;./?.luac;/usr/share/lua/5.4/?.lua;...
-- Add local lib directory
package.path = "./lib/?.lua;" .. package.path
-- Now require("utils") will look in ./lib/utils.luarequire vs dofile vs loadfile
require: menyimpan cache dan mencari di package.path. dofile(path): segera menjalankan file, tanpa cache, dan menerima jalur langsung. loadfile(path): mengompilasi tetapi tidak menjalankan file, lalu mengembalikan fungsi. Gunakan require untuk modul; dofile untuk skrip sekali jalan.
-- dofile: no caching, direct path
dofile("./scripts/setup.lua")
-- loadfile: compile only, returns function
local fn, err = loadfile("./config.lua")
if fn then
local result = fn() -- execute when ready
end
-- require: best for modules
local json = require("json")require dengan Titik untuk Direktori
Gunakan titik dalam nama modul untuk merujuk file di subdirektori. require("utils.string") dipetakan ke utils/string.lua (dengan ? dalam pola jalur). Inilah cara pustaka yang terdiri dari banyak file diatur.
-- Directory structure:
-- lib/
-- utils/
-- string.lua
-- table.lua
-- init.lua
package.path = "./lib/?.lua;" .. package.path
local strUtils = require("utils.string") -- loads lib/utils/string.lua
local tblUtils = require("utils.table") -- loads lib/utils/table.luaEfek Samping Inisialisasi Modul
File modul dijalankan sekali saat pertama kali diperlukan. Kode apa pun pada tingkat teratas (di luar fungsi) berjalan saat require dipanggil. Ini berguna untuk inisialisasi satu kali, tetapi berhati-hatilah—efek samping seperti koneksi jaringan atau operasi file berjalan saat impor.
-- counter.lua:
-- local count = 0 -- initialized once on first require
-- local M = {}
-- function M.increment() count = count + 1 end
-- function M.get() return count end
-- return M
local c = require("counter")
c.increment()
c.increment()
print(c.get()) -- 2
local c2 = require("counter")
print(c2.get()) -- 2 (same instance, cached)Penanganan Error dalam require
Jika file modul memiliki error sintaks atau menghasilkan error saat dimuat, require menghasilkan error. Pesan error tersebut menyertakan nama modul dan error dari dalam file. Gunakan pcall untuk menangani kegagalan pemuatan modul dengan baik.
local ok, mod = pcall(require, "possibly_missing")
if not ok then
print("Module not available:", mod)
-- fall back to alternative or default implementation
mod = {feature = function() return "fallback" end}
end
print(mod.feature())package.preload
package.preload adalah tabel tempat Anda dapat mendaftarkan fungsi pemuat berdasarkan nama modul. Saat require("name") dipanggil, Lua memeriksa preload terlebih dahulu. Dengan demikian, Anda dapat mendaftarkan modul tanpa berkas—berguna untuk Lua tertanam atau pengujian.
package.preload["mymath"] = function()
return {
double = function(n) return n * 2 end,
triple = function(n) return n * 3 end,
}
end
local m = require("mymath")
print(m.double(5)) -- 10
print(m.triple(5)) -- 15Require Sirkular
Dependensi sirkular (A memerlukan B, B memerlukan A) ditangani sebagian: Lua menyimpan penanda true di package.loaded sebelum menjalankan modul. Jika B mencoba menggunakan tabel A yang belum selesai, hasil yang diperoleh mungkin tidak lengkap. Hindari dependensi sirkular dalam desain modul.
-- a.lua: local b = require("b"); local M = {}; M.name = "A"; return M
-- b.lua: local a = require("a"); print("a.name:", a.name); return {}
-- When a.lua is loaded:
-- 1. a starts executing
-- 2. requires b -> b starts executing
-- 3. b requires a -> gets partial a (still loading!)
-- 4. a.name may be nil at step 3
print("Avoid circular requires in module design")Pemeriksaan Cepat
Apa yang terjadi saat Anda memanggil require("mod") untuk kedua kalinya?
Rangkuman: require
Ringkasan:
require(name)memuat satu kali dan menyimpannya dipackage.loaded- Berkas modul mengembalikan antarmuka publiknya (biasanya berupa tabel)
- Hapus
package.loaded[name]untuk memaksa pemuatan ulang - Tambahkan ke
package.pathuntuk direktori pencarian khusus - Gunakan
package.preloaduntuk modul dalam memori - Hindari dependensi sirkular
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Fungsi require” gratis?
Ya — teks lengkap “Fungsi require” 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 “Fungsi require”?
Muat modul eksternal dengan require dan pahami caching modul. 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 “Fungsi require” 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.