Basi
Hello World
print("Hello, Lua!")
Variabili e Assegnazione
local name = "Lua" -- local variable x = 10 -- global (avoid) local a, b = 1, 2 -- multiple assignment a, b = b, a -- swap values
Commenti
-- single line comment --[[ multi-line comment ]]
Operatori
+ - * / %Operatori aritmetici
//Divisione intera (5.3+)
^Esponenziazione
..Concatenazione di stringhe
#Operatore lunghezza
== ~=Uguale / diverso
and or notOperatori logici
Tipi
Tipi di Dato
nilAssenza di valore; falsy
booleantrue o false
numberFloat a doppia precisione (o intero in 5.3+)
stringSequenza di byte immutabile
tableArray associativo (unico tipo composto)
functionClosure di prima classe
userdataDati C integrati in Lua
threadHandle di coroutine
Controllo del Tipo
print(type(42)) -- "number" print(type("hi")) -- "string" print(type(nil)) -- "nil" print(type({})) -- "table"
Tabelle
Tabelle stile Array
local fruits = {"apple", "banana", "cherry"} print(fruits[1]) -- "apple" (1-indexed) table.insert(fruits, "date") table.remove(fruits, 2) -- remove "banana" print(#fruits) -- length
Tabelle stile Dizionario
local user = {name = "Alice", age = 30} user.email = "[email protected]" -- add field user["name"] = "Bob" -- bracket access user.age = nil -- remove field
Funzioni per Tabelle
table.insert(t, v)Aggiunge un valore all'array
table.insert(t, i, v)Inserisce nella posizione i
table.remove(t, i)Rimuove l'elemento nella posizione i
table.sort(t [,cmp])Ordina l'array in-place
table.concat(t, sep)Unisce gli elementi dell'array in stringa
table.move(t,a,b,c)Sposta gli elementi da a..b alla posizione c
Funzioni
Definizione di Funzione
local function add(a, b) return a + b end local mul = function(a, b) return a * b end print(add(2, 3)) -- 5
Vararg e Ritorni Multipli
local function sum(...) local s = 0 for _, v in ipairs({...}) do s = s + v end return s end local function swap(a, b) return b, a end local x, y = swap(1, 2)
Closure
local function counter() local n = 0 return function() n = n + 1; return n end end local c = counter() print(c(), c()) -- 1 2
Controllo del Flusso
Condizionali
if x > 0 then print("positive") elseif x == 0 then print("zero") else print("negative") end
Cicli
for i = 1, 10 do print(i) end for i = 10, 1, -1 do print(i) end for k, v in pairs(tbl) do print(k, v) end for i, v in ipairs(arr) do print(i, v) end
While e Repeat
while x > 0 do x = x - 1 end repeat x = x + 1 until x >= 10
Stringhe
Funzioni per Stringhe
string.len(s) / #sLunghezza della stringa in byte
string.sub(s, i, j)Sottostringa da i a j
string.upper(s)Converti in maiuscolo
string.lower(s)Converti in minuscolo
string.rep(s, n)Ripeti la stringa n volte
string.reverse(s)Inverti la stringa
string.format(fmt, ...)Formattazione stile printf
string.find(s, pat)Trova pattern, restituisce indici
string.gsub(s, pat, rep)Sostituzione globale
string.gmatch(s, pat)Iteratore sulle corrispondenze del pattern
Caratteri Pattern
.Qualsiasi carattere
%a / %ALettere / non-lettere
%d / %DCifre / non-cifre
%w / %WAlfanumerico / non-alfanumerico
%s / %SSpazio bianco / non-spazio
%pPunteggiatura
* + - ?Greedy, greedy, lazy, opzionale
Metatable
Impostazione delle Metatable
local mt = {} mt.__add = function(a, b) return {val = a.val + b.val} end local a = setmetatable({val=1}, mt) local b = setmetatable({val=2}, mt) local c = a + b -- c.val == 3
Metamethod Comuni
__indexRicerca chiavi mancanti (tabella o funzione)
__newindexIntercetta l'assegnazione di nuove chiavi
__add / __sub / __mulOperatori aritmetici
__eq / __lt / __leOperatori di confronto
__tostringRappresentazione testuale personalizzata
__lenOperatore # personalizzato
__callChiama la tabella come funzione
__concatOperatore .. personalizzato
OOP con Metatable
local Dog = {}; Dog.__index = Dog function Dog.new(name) return setmetatable({name=name}, Dog) end function Dog:bark() print(self.name.." says Woof") end local d = Dog.new("Rex"); d:bark()
Coroutine
Ciclo di Vita delle Coroutine
coroutine.create(f)Crea coroutine dalla funzione
coroutine.resume(co, ...)Avvia o riprende la coroutine
coroutine.yield(...)Sospende l'esecuzione, restituisce valori
coroutine.status(co)"running", "suspended", "dead"
coroutine.wrap(f)Crea un wrapper chiamabile per coroutine
Esempio di Coroutine
local function gen(max) for i = 1, max do coroutine.yield(i) end end local co = coroutine.wrap(gen) print(co(5)) -- 1 print(co()) -- 2
Moduli
Creazione di un Modulo
-- mylib.lua local M = {} function M.greet(name) return "Hello, " .. name end return M
Uso dei Moduli
local mylib = require("mylib") print(mylib.greet("World"))
Librerie Standard
mathFunzioni matematiche (sin, random, huge, ecc.)
stringManipolazione di stringhe e pattern
tableManipolazione di tabelle (insert, sort, ecc.)
ioOperazioni di I/O su file
osFunzioni OS (time, clock, execute)
debugInterfaccia di debug (usare con parsimonia)
Pattern Comuni
Idioma Ternario
-- Lua has no ternary; use and/or idiom local val = condition and "yes" or "no" -- Caution: fails if "yes" is false/nil
Accesso Sicuro alle Tabelle
local function get(t, ...) for _, k in ipairs({...}) do if type(t) ~= "table" then return nil end t = t[k] end return t end get(config, "db", "host") -- safe nested access
ipairs vs pairs
-- ipairs: array part, stops at first nil for i, v in ipairs(arr) do print(i, v) end -- pairs: all keys (unordered) for k, v in pairs(tbl) do print(k, v) end