Η Lua είναι μια ισχυρή, αποδοτική, ελαφριά και ενσωματώσιμη γλώσσα σεναρίων σχεδιασμένη για την επέκταση εφαρμογών.
Βασική Σύνταξη
Σχόλια
-- Μονόγραμμο σχόλιο
--[[
Πολύγραμμο σχόλιο
--]]
Συντομογραφία Κλήσης Συναρτήσεων
Οι παρενθέσεις μπορούν να παραλειφθούν όταν η συνάρτηση δέχεται ακριβώς μία συμβολοσειρά ή πίνακα:
print("Hello World") <==> print "Hello World"
dofile('app.lua') <==> dofile 'app.lua'
config({ x = 1 }) <==> config{ x = 1 }
Πίνακες (Tables & Arrays)
Οι πίνακες είναι η μοναδική δομή δεδομένων στη Lua. Τα arrays χρησιμοποιούν ευρετηρίαση από το 1:
-- Κενός πίνακας
local t = {}
-- Πίνακας κλειδιού-τιμής (λεξικό)
local user = { name = "Alice", age = 30 }
user.role = "admin"
user["email"] = "[email protected]"
-- Ακολουθιακός πίνακας (ευρετήριο από το 1)
local fruits = { "apple", "banana", "cherry" }
print(fruits[1]) -- τυπώνει "apple"
print(#fruits) -- τελεστής μήκους (3)
Έλεγχος Ροής & Βρόχοι
Συνθήκες
Μόνο το false και το nil είναι falsy στη Lua. Το 0 και το "" είναι truthy:
if score >= 90 then
grade = "A"
elseif score >= 80 then
grade = "B"
else
grade = "C"
end
Βρόχοι
-- Βρόχος While
local count = 1
while count <= 5 do
count = count + 1
end
-- Βρόχος Repeat...until (εκτελείται τουλάχιστον μία φορά)
repeat
count = count - 1
until count == 0
-- Αριθμητικός βρόχος for: for var = start, stop [, step]
for i = 1, 10, 2 do
print(i) -- 1, 3, 5, 7, 9
end
-- Γενικός βρόχος for: ipairs (πίνακας) και pairs (λεξικό)
for index, value in ipairs(fruits) do
print(index, value)
end
for key, value in pairs(user) do
print(key, value)
end
Συναρτήσεις
Ορισμοί & Πολλαπλές Τιμές Επιστροφής
-- Πολλαπλές επιστροφές
local function min_max(a, b)
if a < b then
return a, b
else
return b, a
end
end
local minimum, maximum = min_max(10, 5)
-- Μεταβλητός αριθμός ορισμάτων (varargs)
local function sum(...)
local s = 0
for _, v in ipairs({...}) do
s = s + v
end
return s
end
Metatables & Αντικειμενοστραφής Προγραμματισμός
Metatables & Metamethods
local Vector = {}
Vector.__index = Vector
function Vector.new(x, y)
local instance = setmetatable({}, Vector)
instance.x = x
instance.y = y
return instance
end
-- Metamethod πρόσθεσης διανυσμάτων
function Vector.__add(a, b)
return Vector.new(a.x + b.x, a.y + b.y)
end
function Vector:__tostring()
return string.format("(%d, %d)", self.x, self.y)
end
local v1 = Vector.new(1, 2)
local v2 = Vector.new(3, 4)
local v3 = v1 + v2
print(v3) -- "(4, 6)"
Αναφορά Metamethods
| Metamethod | Συμβάν Ενεργοποίησης |
|---|---|
__index |
Ανάγνωση μη υπαρκτού πεδίου (t[k]) |
__newindex |
Ανάθεση σε μη υπαρκτό πεδίο (t[k] = v) |
__tostring |
Μετατροπή σε συμβολοσειρά (tostring(t)) |
__call |
Κλήση πίνακα ως συνάρτηση (t()) |
__add, __sub |
Πρόσθεση (+), αφαίρεση (-) |
__mul, __div |
Πολλαπλασιασμός (*), διαίρεση (/) |
__eq, __lt, __le |
Σύγκριση (==, <, <=) |
__concat |
Συνένωση (..) |
APIs Τυπικής Βιβλιοθήκης
Συναρτήσεις Συμβολοσειρών
string.len("hello") -- 5 (#"hello" also works)
string.lower("HELLO") -- "hello"
string.upper("hello") -- "HELLO"
string.sub("hello", 2, 4) -- "ell"
string.format("%s = %d", "x", 5)-- "x = 5"
string.gsub("banana", "a", "o") -- "bonono"
string.find("hello world", "wor") -- 7, 9
Συναρτήσεις Πινάκων
table.insert(fruits, "orange") -- Προσάρτηση στο τέλος
table.insert(fruits, 1, "grape") -- Εισαγωγή στο δείκτη 1
table.remove(fruits, 1) -- Αφαίρεση πρώτου στοιχείου
table.concat(fruits, ", ") -- Ένωση συμβολοσειρών: "apple, banana"
table.sort(fruits) -- Επιτόπια ταξινόμηση πίνακα
Μαθηματικές Συναρτήσεις
math.abs(-10) -- 10
math.floor(3.7) -- 3
math.ceil(3.2) -- 4
math.max(1, 9, 4) -- 9
math.random(1, 100) -- Τυχαίος ακέραιος μεταξύ 1 και 100