Lua Academy · Pelajaran

Fungsi require

Muatkan modul luaran dengan require dan fahami pencachean modul.

Pelajaran 1 daripada 412 langkah

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)  -- true

Nilai 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 interface

Pencachean 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 mock

Format 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.lua

require 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.lua

Kesan 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))   -- 15

Keperluan 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 cache package.loaded
  • Fail modul mengembalikan antara muka awamnya (biasanya jadual)
  • Kosongkan package.loaded[name] untuk memaksa pemuatan semula
  • Tambahkan pada package.path untuk direktori carian tersuai
  • Gunakan package.preload untuk modul dalam memori
  • Elakkan kebergantungan circular
Percuma untuk bermula

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.

Semua pelajaran dalam kursus ini

  1. Fungsi require
  2. Menulis Fail Modul
  3. package.path dan package.cpath
  4. Corak Modul dan Amalan Terbaik
← Kembali ke Lua Academy