Funkcja require
Proszę ładować zewnętrzne moduły za pomocą require i poznać buforowanie modułów.
Funkcja require to bezpłatna lekcja Lua Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Lua Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Lua Academy zawiera 4 lekcji w sumie.
Jak działa require
require(modname) ładuje moduł i zwraca jego wartość. Wyszukuje plik .lua za pomocą package.path, a bibliotekę C za pomocą package.cpath. Wynik jest buforowany w package.loaded[modname] — kolejne wywołania zwracają wartość z pamięci podręcznej bez ponownego wykonywania pliku.
-- 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) -- trueWartość zwracana przez moduł
Plik modułu powinien zwracać wartość — zazwyczaj tabelę funkcji. Ta wartość jest zwracana kodowi wywołującemu przez require. Jeśli plik niczego nie zwraca (albo zwraca true), właśnie to zwróci 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 interfaceBuforowanie w package.loaded
package.loaded to tabela mapująca nazwy modułów na załadowane wartości. Można ręcznie ustawić wpis, aby wstępnie załadować atrapę, albo ustawić go na nil, aby wymusić ponowne ładowanie (plik modułu zostanie ponownie wykonany przy następnym wywołaniu 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 mockFormat package.path
package.path to lista wzorców rozdzielonych średnikami. Symbol zastępczy ? jest zastępowany nazwą modułu (kropki są zamieniane na separatory ścieżki). Katalogi wyszukiwania można dodawać, umieszczając je na początku 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 a dofile i loadfile
require: buforuje i wyszukuje w package.path. dofile(path): natychmiast wykonuje plik, nie buforuje go i przyjmuje bezpośrednią ścieżkę. loadfile(path): kompiluje plik, ale go nie wykonuje — zwraca funkcję. Należy używać require dla modułów, a dofile dla jednorazowych skryptów.
-- 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 z kropkami w nazwach katalogów
Kropki w nazwach modułów służą do wskazywania plików w podkatalogach. require("utils.string") odpowiada plikowi utils/string.lua (przy użyciu ? we wzorcu ścieżki). W ten sposób organizuje się biblioteki składające się z wielu plików.
-- 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.luaSkutki uboczne inicjalizacji modułu
Pliki modułów są wykonywane raz, przy pierwszym użyciu require. Każdy kod na najwyższym poziomie (poza funkcjami) jest uruchamiany podczas require. Jest to przydatne przy jednorazowej inicjalizacji, ale należy zachować ostrożność — skutki uboczne, takie jak nawiązywanie połączeń sieciowych lub operacje na plikach, występują podczas importowania.
-- 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)Obsługa błędów w require
Jeśli plik modułu zawiera błąd składni lub zgłasza błąd podczas ładowania, require zgłasza błąd. Komunikat błędu zawiera nazwę modułu oraz błąd występujący wewnątrz pliku. Należy użyć pcall, aby poprawnie obsługiwać niepowodzenia ładowania modułów.
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 to tabela, w której można rejestrować funkcje ładujące według nazwy modułu. Gdy wywoływane jest require("name"), Lua najpierw sprawdza tabelę preload. Dzięki temu można rejestrować moduły bez plików — jest to przydatne w przypadku osadzonej wersji Lua lub testów.
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)) -- 15Cykliczne require
Zależności cykliczne (A wymaga B, B wymaga A) są częściowo obsługiwane: przed wykonaniem modułu Lua zapisuje symbol zastępczy true w package.loaded. Jeśli B spróbuje użyć niedokończonej tabeli A, może otrzymać niekompletne wyniki. Podczas projektowania modułów należy unikać zależności cyklicznych.
-- 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")Szybkie sprawdzenie
Co się dzieje po drugim wywołaniu require("mod")?
Podsumowanie: require
Podsumowanie:
require(name)ładuje moduł tylko raz i zapisuje go w pamięci podręcznejpackage.loaded- Plik modułu zwraca swój publiczny interfejs (zwykle tabelę)
- Wyczyść
package.loaded[name], aby wymusić ponowne ładowanie - Dodaj ścieżki do
package.path, aby używać niestandardowych katalogów wyszukiwania - Używaj
package.preloadw przypadku modułów przechowywanych w pamięci - Unikaj zależności cyklicznych
Często zadawane pytania
Czy lekcja „Funkcja require” jest bezpłatna?
Tak — pełny tekst „Funkcja require” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Lua Academy, przejdź na CoddyKit PRO. Kurs Lua Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Funkcja require”?
Proszę ładować zewnętrzne moduły za pomocą require i poznać buforowanie modułów. Ćwiczysz Lua Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Lua Academy?
Nie wymagamy żadnego doświadczenia. Lua Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Funkcja require”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Lua Academy?
Tak. Każda lekcja Lua Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.