EMZETT.
Login

Kurz: Das Einbetten in C ist Luas ursprünglicher Zweck: Die Host-Anwendung stellt Funktionen bereit, Nutzer skripten das Verhalten.

Teil des Kurses Lua

Kapitel 8 von 8 im Kurs Lua (Abschnitt „Nachschlagen“). Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

Wo Lua zu Hause ist

BereichBeispiel
SpieleRoblox (Luau), Love2D, Defold, Solar2D, Garry’s Mod, World of Warcraft-Addons
EditorenNeovim (Konfiguration und Plugins), Wireshark
ServerOpenResty/nginx, Redis (Skripte), Kong
EingebettetRouter, Embedded-Geräte, Adobe Lightroom

Das Einbetten in C ist Luas ursprünglicher Zweck: Die Host-Anwendung stellt Funktionen bereit, Nutzer skripten das Verhalten.

// C-Seite (Prinzip)
lua_State *L = luaL_newstate();
luaL_openlibs(L);
lua_register(L, "spiele_sound", meine_c_funktion);
luaL_dofile(L, "level1.lua");
lua_close(L);

Love2D: ein Spiel in wenigen Zeilen

-- main.lua
local spieler = {x = 100, y = 100, tempo = 200}
 
function love.update(dt)
    if love.keyboard.isDown("right") then spieler.x = spieler.x + spieler.tempo * dt end
    if love.keyboard.isDown("left")  then spieler.x = spieler.x - spieler.tempo * dt end
end
 
function love.draw()
    love.graphics.rectangle("fill", spieler.x, spieler.y, 32, 32)
    love.graphics.print("Pfeiltasten bewegen den Block", 10, 10)
end

Neovim konfigurieren

-- ~/.config/nvim/init.lua
vim.opt.number = true
vim.opt.tabstop = 4
vim.g.mapleader = " "
vim.keymap.set("n", "<leader>w", ":w<CR>", { desc = "Speichern" })
vim.api.nvim_create_autocmd("BufWritePre", {
  pattern = "*.lua",
  callback = function() vim.lsp.buf.format() end,
})

Standardbibliothek im Überblick

BibliothekWichtige Funktionen
stringlen sub upper lower find match gmatch gsub format rep reverse byte char
tableinsert remove concat sort unpack pack move
mathfloor ceil sqrt abs max min random randomseed pi huge tointeger type
ostime date clock getenv remove rename tmpname exit
ioopen read write lines close
utf8char codepoint len codes offset
coroutinecreate resume yield status wrap isyieldable
Globalprint type tostring tonumber pairs ipairs next select assert error pcall xpcall setmetatable getmetatable require load
math.randomseed(42)
local z = math.random(1, 6)
print(z >= 1 and z <= 6, math.random() < 1, math.huge > 1e308, -math.huge)
print(os.getenv("GIBT_ES_NICHT_12345"), os.clock() >= 0, type(os.time()))
print(load("return 1 + 2")())
print(select("#"), #arg >= 0)

Ausgabe:

true	true	true	-inf
nil	true	number
3
0	true

Leistung und Werkzeuge

  • LuaJIT: sehr schneller JIT-Compiler (Lua 5.1-kompatibel), z. B. in OpenResty
  • Luau: Roblox’ Variante mit Typannotationen
  • LuaRocks: Paketmanager (luarocks install lpeg)
  • busted, luaunit: Tests; luacheck: Linter; StyLua: Formatierer
  • Messen: os.clock(); Tabellen vorab dimensionieren (table.move), Schleifen lokal halten

Häufige Fehler

ProblemUrsache / Lösung
attempt to index a nil valueVariable oder Feld ist nil: vorher prüfen (t and t.x)
attempt to perform arithmetic on a nil valuenicht initialisierte Variable
attempt to compare number with nilgleiche Ursache beim Vergleichen
Variable “verschwindet”fehlendes local macht sie global (oder umgekehrt)
#t liefert falsche LängeTabelle mit Lücken (nil-Werte); Lua garantiert dann nichts
Reihenfolge bei pairs wechseltpairs ist ungeordnet: Schlüssel sortieren
!= funktioniert nichtrichtig ist ~=
Listen starten bei 0in Lua bei 1

Weiterlernen

  • Programming in Lua (Roberto Ierusalimschy, online frei: lua.org/pil)
  • Referenzhandbuch lua.org/manual
  • Love2D-Wiki (love2d.org), Neovim-Dokumentation :help lua-guide
  • Übungen: Exercism (Lua-Track), Advent of Code

Merke

  • Lua = Tabellen + Funktionen + Coroutinen, in wenigen Seiten erlernbar
  • local verwenden, Indizes ab 1, ~= für ungleich
  • Metatabellen ermöglichen OOP, Operatoren und Standardwerte
  • Einsatz in Spielen, Neovim, nginx, Embedded

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Fehler, Module und Coroutinen

Alle Kapitel: Lua im Überblick