Fungsi require
Muatkan modul luaran dengan require dan fahami pencachean modul.
Fungsi require ialah pelajaran Lua Academy percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Lua Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Lua Academy merangkumi sejumlah 4 pelajaran.
Cara require Berfungsi
require(modname) memuatkan dan mengembalikan modul. Ia mencari package.path untuk fail .lua dan package.cpath untuk pustaka C. Hasilnya dicache dalam package.loaded[modname] — panggilan seterusnya mengembalikan nilai yang dicache tanpa melaksanakan semula fail.
-- 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 Pulangan Modul
Fail modul sepatutnya mengembalikan suatu nilai — biasanya jadual fungsi. Nilai pulangan inilah yang diberikan oleh require kepada pemanggil. Jika fail tidak mengembalikan apa-apa (atau true), itulah yang dikembalikan oleh 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 interfacePencachean dalam package.loaded
package.loaded ialah jadual yang memetakan nama modul kepada nilai yang dimuatkan. Anda boleh menetapkan entri secara manual untuk pramuat mock, atau menetapkannya kepada nil untuk memaksa pemuatan semula (fail modul akan dilaksanakan semula pada require yang seterusnya).
-- 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 ialah senarai corak yang dipisahkan dengan koma bernoktah. Ruang letak ? digantikan dengan nama modul (dengan noktah digantikan oleh pemisah laluan). Anda boleh menambahkan direktori untuk dicari dengan meletakkannya di hadapan 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 berbanding dofile berbanding loadfile
require: mencache dan mencari package.path. dofile(path): melaksanakan fail serta-merta, tanpa pencachean, dan menerima laluan terus. loadfile(path): menyusun tetapi tidak melaksanakan fail, lalu mengembalikan fungsi. Gunakan require untuk modul; dofile untuk skrip sekali guna.
-- 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 fail dalam subdirektori. require("utils.string") dipetakan kepada utils/string.lua (dengan ? dalam corak laluan). Beginilah pustaka berbilang fail disusun.
-- 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.luaKesan Sampingan Pemulaan Modul
Fail modul dilaksanakan sekali apabila pertama kali diperlukan. Sebarang kod pada aras teratas (di luar fungsi) berjalan pada masa require. Ini berguna untuk pemulaan sekali sahaja, tetapi berhati-hatilah — kesan sampingan seperti sambungan rangkaian atau operasi fail berjalan pada masa import.
-- 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)Pengendalian Ralat dalam require
Jika fail modul mempunyai ralat sintaks atau menghasilkan ralat semasa dimuatkan, require menghasilkan ralat. Mesej ralat itu menyertakan nama modul dan ralat dari dalam fail. Gunakan pcall untuk mengendalikan 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 ialah jadual tempat Anda boleh mendaftarkan fungsi pemuat mengikut nama modul. Apabila require("name") dipanggil, Lua akan menyemak preload terlebih dahulu. Ini membolehkan Anda mendaftarkan modul tanpa fail — berguna untuk Lua terbenam 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)) -- 15Keperluan circular
Kebergantungan circular (A memerlukan B, B memerlukan A) dikendalikan sebahagiannya: Lua menyimpan ruang letak true dalam package.loaded sebelum melaksanakan modul. Jika B cuba menggunakan jadual A yang belum selesai, hasil yang diterima mungkin tidak lengkap. Elakkan kebergantungan circular dalam reka bentuk 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")Semakan Pantas
Apakah yang berlaku apabila Anda memanggil require("mod") untuk kali kedua?
Imbas Kembali: require
Ringkasan:
require(name)memuatkan sekali dan menyimpannya dalam cachepackage.loaded- Fail modul mengembalikan antara muka awamnya (biasanya jadual)
- Kosongkan
package.loaded[name]untuk memaksa pemuatan semula - Tambahkan pada
package.pathuntuk direktori carian tersuai - Gunakan
package.preloaduntuk modul dalam memori - Elakkan kebergantungan circular
Pelajari Lua dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 40
- Pelajaran
- 159
Soalan Lazim
Adakah pelajaran “Fungsi require” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Lua Academy, termasuk “Fungsi require”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Lua Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Fungsi require”?
Muatkan modul luaran dengan require dan fahami pencachean modul. Anda berlatih Lua Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Lua Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Lua Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.
Berapa lamakah pelajaran “Fungsi require” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Lua Academy ini?
Ya. Setiap pelajaran Lua Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.