Eine Moduldatei schreiben
Erstellen Sie ein Modul, indem Sie aus einer .lua-Datei eine Tabelle mit Funktionen zurückgeben
Eine Moduldatei schreiben ist eine kostenlose Lua Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Lua Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.
Das grundlegende Modulmuster
Das standardmäßige Lua-Modulmuster: Erstellen Sie eine lokale Tabelle M, fügen Sie ihr Funktionen und Werte hinzu und geben Sie sie am Ende zurück. Die Tabelle ist die öffentliche API des Moduls. Alle anderen lokalen Variablen in der Datei sind privat.
-- stringutils.lua
local M = {}
function M.trim(s)
return s:match("^%s*(.-)%s*$")
end
function M.split(s, sep)
local t = {}
for p in s:gmatch("[^"..sep.."]+") do t[#t+1]=p end
return t
end
return M
-- Usage:
-- local su = require("stringutils")
-- print(su.trim(" hello "))Privater Zustand
Variablen, die in der Moduldatei mit local deklariert werden, sind privat – Aufrufer können nicht auf sie zugreifen. Funktionen im Modul können über Upvalues auf den privaten Zustand zugreifen. Das ist Lua's Mechanismus zur Kapselung.
-- counter.lua
local M = {}
local count = 0 -- private state
function M.increment(n)
count = count + (n or 1)
end
function M.reset()
count = 0
end
function M.get()
return count
end
return MModul mit Initialisierung
Manche Module benötigen eine Initialisierung (Konfiguration, Verbindungen). Platzieren Sie den Initialisierungscode auf Modulebene (am Anfang der Datei) oder in einer expliziten Funktion M.init(). Die Initialisierung auf Modulebene wird einmal ausgeführt, wenn das Modul erstmals per require geladen wird; init() muss explizit aufgerufen werden.
-- cache.lua
local M = {}
local store = {} -- initialized at load time
local hits = 0
local misses = 0
function M.get(key)
if store[key] ~= nil then
hits = hits + 1
return store[key]
end
misses = misses + 1
return nil
end
function M.set(key, val) store[key] = val end
function M.stats() return {hits=hits, misses=misses} end
return MModul mit Klasse
Ein Modul kann eine Klasse exportieren: eine Tabelle mit einer Konstruktorfunktion. Die zurückgegebene Modultabelle enthält die Funktion new() und kann zusätzlich als Metatable der Klasse dienen.
-- point.lua
local Point = {}
Point.__index = Point
function Point.new(x, y)
return setmetatable({x=x, y=y}, Point)
end
function Point:distance(other)
local dx, dy = self.x-other.x, self.y-other.y
return math.sqrt(dx*dx + dy*dy)
end
function Point:__tostring()
return string.format("(%g,%g)", self.x, self.y)
end
return Point
-- Usage:
-- local Point = require("point")
-- local p = Point.new(3, 4)Modulkonstanten
Exportieren Sie Konstanten, indem Sie sie zur Modultabelle hinzufügen. Konventionell werden Konstanten großgeschrieben. Da Lua kein const kennt, können Benutzer sie technisch gesehen ändern; die Großschreibung signalisiert jedoch „nicht ändern“.
-- colors.lua
local M = {}
M.RED = {r=255, g=0, b=0}
M.GREEN = {r=0, g=255, b=0}
M.BLUE = {r=0, g=0, b=255}
M.WHITE = {r=255, g=255, b=255}
M.BLACK = {r=0, g=0, b=0}
function M.toHex(c)
return string.format("#%02X%02X%02X", c.r, c.g, c.b)
end
return MModulversionierung
Nehmen Sie ein Versionsfeld in Ihr Modul auf. Aufrufer können die Version prüfen, um die Kompatibilität sicherzustellen. Verwenden Sie semantische Versionierung (major.minor.patch).
-- mylib.lua
local M = {}
M._VERSION = "1.2.3"
M._NAME = "mylib"
M._DESCRIPTION = "My Lua library"
function M.hello(name)
return "Hello, " .. (name or "World") .. "!"
end
return M
-- Usage:
local mylib = require("mylib")
print(mylib._VERSION) -- 1.2.3
print(mylib.hello("Lua"))Untermodule
Große Bibliotheken werden in Untermodule aufgeteilt. Das Hauptmodul kann Untermodule per require laden und erneut exportieren, oder jedes Untermodul wird unabhängig verwendet. Organisieren Sie die Dateien in Verzeichnissen, die dem Modulpfad entsprechen.
-- mylib/init.lua (loaded by require("mylib"))
local M = {}
M.strings = require("mylib.strings")
M.tables = require("mylib.tables")
M.math = require("mylib.math")
M._VERSION = "2.0.0"
return M
-- Users can require the whole library:
-- local mylib = require("mylib")
-- mylib.strings.trim(...)
-- Or individual sub-modules:
-- local strs = require("mylib.strings")Modul mit Metatable
Machen Sie ein Modul aufrufbar, indem Sie ihm eine Metatable mit __call geben. Das ist nützlich für Module, die hauptsächlich aus Funktionen bestehen, aber auch Hilfsfunktionen bieten – die „Hauptoperation“ ist der Aufruf, die Hilfsfunktionen sind Felder.
-- format.lua
local M = {}
setmetatable(M, {__call = function(_, fmt, ...)
return string.format(fmt, ...)
end})
function M.pad(s, width, char)
char = char or " "
return string.rep(char, math.max(0, width - #s)) .. s
end
return M
-- Usage:
-- local fmt = require("format")
-- print(fmt("%.2f", 3.14)) -- 3.14
-- print(fmt.pad("42", 5)) -- 42Untermodule verzögert laden
Verwenden Sie __index, um Untermodule verzögert zu laden – also erst, wenn erstmals auf sie zugegriffen wird. Das beschleunigt den Start großer Bibliotheken mit vielen Untermodulen.
-- biglib.lua
local M = {}
local submodules = {"strings", "tables", "math", "io"}
setmetatable(M, {
__index = function(t, k)
for _, name in ipairs(submodules) do
if name == k then
local mod = require("biglib." .. k)
rawset(t, k, mod)
return mod
end
end
return nil
end
})
return M
-- Loads biglib.strings only when accessed:
-- local lib = require("biglib")
-- lib.strings.trim(...)Muster zum Testen von Modulen
Fügen Sie am Ende der Moduldatei eine Testfunktion oder einen Testblock ein, der nur bedingt ausgeführt wird, wenn die Datei direkt ausgeführt wird (nicht per require geladen wird). So bleiben Unit-Tests zusammen mit dem Code abgelegt.
-- utils.lua
local M = {}
function M.clamp(v, lo, hi)
return math.max(lo, math.min(hi, v))
end
-- Self-test: only runs when executed directly
if debug.getinfo(2, "S") == nil then
-- Running as main script, not required
print("Testing clamp...")
assert(M.clamp(5, 0, 10) == 5)
assert(M.clamp(-1, 0, 10) == 0)
assert(M.clamp(15, 0, 10) == 10)
print("All tests passed!")
end
return MKurzer Check
Wie definiert man privaten Zustand standardmäßig in einem Lua-Modul?
Zusammenfassung: Module schreiben
Zusammenfassung:
- Muster:
local M = {} ... return M - Lokale Variablen in der Datei = privat; M-Felder = öffentliche API
- Code auf Modulebene wird beim ersten require einmal ausgeführt
- Exportieren Sie Klassen über einen Konstruktor in der Modultabelle
- Untermodule über
__indexverzögert laden - Nehmen Sie
_VERSIONfür Kompatibilitätsprüfungen auf
Häufig gestellte Fragen
Ist die Lektion „Eine Moduldatei schreiben“ kostenlos?
Ja — der vollständige Text von „Eine Moduldatei schreiben“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Lua Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Eine Moduldatei schreiben“?
Erstellen Sie ein Modul, indem Sie aus einer .lua-Datei eine Tabelle mit Funktionen zurückgeben Du übst Lua Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Lua Academy zu starten?
Keine Vorkenntnisse erforderlich. Lua Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „Eine Moduldatei schreiben“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Lua Academy-Lektion Code schreiben und ausführen?
Ja. Jede Lua Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Die Funktion require
- Eine Moduldatei schreiben
- package.path und package.cpath
- Modulmuster und bewährte Verfahren