Lua Academy · leksjon

Funksjonen require

Last inn eksterne moduler med require, og forstå hurtigbufring av moduler.

Leksjon 1 av 412 trinn

Funksjonen require er en gratis leksjon i Lua Academy på CoddyKit. Dette er leksjon 1 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Lua Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Lua Academy inneholder totalt 4 leksjoner.

Slik fungerer require

require(modname) laster inn og returnerer en modul. Funksjonen søker etter en .lua-fil i package.path og etter et C-bibliotek i package.cpath. Resultatet bufres i package.loaded[modname] – senere kall returnerer den bufrede verdien uten å kjøre filen på nytt.

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

Modulens returverdi

En modulf il bør returnere en verdi – vanligvis en tabell med funksjoner. Denne returverdien er det require gir tilbake til kalleren. Hvis filen ikke returnerer noe (eller true), er det dette require returnerer.

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

Bufring i package.loaded

package.loaded er en tabell som knytter modulnavn til verdiene de er lastet inn som. De kan manuelt angi en oppføring for å forhåndslaste en mock, eller sette den til nil for å tvinge frem en ny lasting (modulfilen kjøres på nytt ved neste require).

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

Formatet til package.path

package.path er en semikolondelt liste med mønstre. Plassholderen ? erstattes av modulnavnet (der punktum erstattes med baneskilletegn). De kan legge til kataloger i søket ved å sette dem først i 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 kontra dofile kontra loadfile

require: bufrer og søker i package.path. dofile(path): kjører en fil umiddelbart, uten bufring, og bruker en direkte bane. loadfile(path): kompilerer filen uten å kjøre den, og returnerer en funksjon. Bruk require for moduler og dofile for engangsskript.

-- 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 med punktum for kataloger

Bruk punktum i modulnavn for å referere til filer i underkataloger. require("utils.string") tilsvarer utils/string.lua (med ? i banemønsteret). Slik organiseres biblioteker som består av flere filer.

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

Bivirkninger ved modulinitialisering

Modulfiler kjøres én gang når de lastes inn for første gang. All kode på toppnivå (utenfor funksjoner) kjøres ved require. Dette er nyttig for initialisering som bare skal skje én gang, men vær forsiktig – bivirkninger som nettverkstilkoblinger eller filoperasjoner utføres ved 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)

Feilhåndtering i require

Hvis en modulf il inneholder en syntaksfeil eller utløser en feil under innlasting, utløser require en feil. Feilmeldingen inneholder modulnavnet og feilen fra modulen. Bruk pcall for å håndtere feil ved lasting av moduler på en kontrollert måte.

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 er en tabell der De kan registrere loader-funksjoner etter modulnavn. Når require("name") kalles, sjekker Lua først preload-tabellen. Dette gjør det mulig å registrere moduler uten filer – nyttig for innebygd Lua eller testing.

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

Sirkulær require

Sirkulære avhengigheter (A krever B, B krever A) håndteres delvis: Lua lagrer en true-plassholder i package.loaded før modulen kjøres. Hvis B prøver å bruke den uferdige tabellen til A, kan resultatet være ufullstendig. Unngå sirkulære avhengigheter i moduldesignet.

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

Hurtigsjekk

Hva skjer når De kaller require("mod") for andre gang?

Oppsummering: require

Oppsummering:

  • require(name) laster inn én gang og mellomlagrer i package.loaded
  • Modulfilen returnerer det offentlige grensesnittet sitt (vanligvis en tabell)
  • Tøm package.loaded[name] for å tvinge frem ny innlasting
  • Legg til i package.path for egendefinerte søkemapper
  • Bruk package.preload for moduler i minnet
  • Unngå sirkulære avhengigheter
Gratis å komme i gang

Lær deg Lua med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
40
Leksjoner
159

Ofte stilte spørsmål

Er leksjonen «Funksjonen require» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Lua Academy, inkludert «Funksjonen require», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Lua Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Funksjonen require»?

Last inn eksterne moduler med require, og forstå hurtigbufring av moduler. Du øver på Lua Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Lua Academy?

Ingen tidligere erfaring er nødvendig. Lua Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.

Hvor lang tid tar leksjonen «Funksjonen require»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Lua Academy-leksjonen?

Ja. Alle Lua Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Funksjonen require
  2. Skrive en modulfil
  3. package.path og package.cpath
  4. Modulmønstre og anbefalte fremgangsmåter
← Tilbake til Lua Academy