Vous avez joué à Roblox, World of Warcraft, Garry's Mod ou vous avez bidouillé avec nginx, sans même vous douter que pendant tout ce temps vous utilisiez Lua. Il est temps de se connaître normalement.
Lua est le langage dont tout le monde dit « ah, c'est pour les jeux », puis il s'avère qu'il vit dans Redis, NGINX (OpenResty), Wireshark, Neovim et dans un tas d'autres endroits où vous avez besoin d'un moteur de script rapide et facile à intégrer.
L'interpréteur Lua pèse moins de 300 Ko. En même temps, Lua est régulièrement inclus dans le top des langages de script les plus rapides (LuaJIT vole généralement au niveau C dans certains benchmarks).

Variables : tout est simple, mais il y a une nuance
Variables par défaut dans Lua mondiaux. Oui, tout comme dans JavaScript jusqu'à "use strict". Et oui, c'est un piège.
-- Это глобальная переменная. Она видна ОТОВСЮДУ.
name = "Code"
-- А вот так — локальная. Используй local ВСЕГДА.
local age = 25
local is_cool = trueRègle numéro un : écrivez toujours local. Si vous avez oublié, la variable fuit dans la portée globale, et ensuite vous déboguerez pendant deux heures, pourquoi counter est réinitialisé dans des endroits aléatoires.
Types de données : le minimalisme dans toute sa splendeur
Dans Lua, au total 8 types. Huit. Pour comparaison, dans TypeScript, vous avez plus de types que d'amis sur LinkedIn.
local a = 42 -- number (и int, и float — всё number)
local b = "hello" -- string
local c = true -- boolean
local d = nil -- nil (отсутствие значения)
local e = {} -- table (массив, объект, словарь — всё в одном)
local f = print -- function (да, функции — это значения)Le plus important : table est la seule structure de données. Tableau ? Table. Objet ? Table. Dictionnaire ? Table aussi. HashMap ? Devinez.
Tableaux : un type pour tous les gouverner
Table en Lua est un couteau suisse. Voir :
-- Как массив (индексация с 1, а не с 0!)
local fruits = {"apple", "banana", "mango"}
print(fruits[1]) -- "apple" (не fruits[0]!)
-- Как словарь
local user = {
name = "Alexey",
level = "senior",
stack = {"Vue", "Nuxt", "Lua"}
}
print(user.name) -- "Alexey"
print(user["level"]) -- "senior"
-- Как и то, и другое одновременно (но лучше так не делай)
local chaos = {
"first",
name = "Chaos",
"second",
power = 9000
}Indexation à partir de l'unité - c'est la raison pour laquelle les développeurs C, Python et JS ont une tête de pierre pendant les 30 premières minutes. Mais ensuite, vous vous y habituez. Je vous le promets.
Conditions et cycles : les classiques du genre
Pas de guillemets. Pas de elif. Juste if, elseif, then et end :
local hp = 75
if hp <= 0 then
print("Game Over")
elseif hp < 30 then
print("Critically low HP!")
else
print("Everything is fine, we live")
endLes cycles sont également sans surprise :
-- Числовой for
for i = 1, 5 do
print("Iteration:", i)
end
-- While
local count = 0
while count < 3 do
print(count)
count = count + 1 -- Да, в Lua нет ++ и +=
end
-- Перебор таблицы
local heroes = {"Geralt", "Link", "Mario"}
for index, hero in ipairs(heroes) do
print(index .. ". " .. hero)
endMoment de douleur : pas de Lua +=, -=, ++. Chaque fois que vous écrivez count = count + 1 comme en 2003. Il y a une proposition d'ajouter des opérateurs composés, mais pour l'instant, il faut s'y faire.
Fonctions : citoyens de première classe
Les fonctions dans Lua sont des valeurs à part entière. Elles peuvent être stockées dans des variables, transmises comme arguments, renvoyées à partir d'autres fonctions :
-- Обычная функция
local function greet(name)
return "Hi, " .. name .. "!"
end
print(greet("World")) -- "Hello, World!"
-- Функция, которая возвращает функцию (замыкание!)
local function create_counter()
local count = 0
return function()
count = count + 1
return count
end
end
local counter = create_counter()
print(counter()) -- 1
print(counter()) -- 2
print(counter()) -- 3Lua prend en charge valeurs de retour multiples — sans aucun emballage dans des tableaux ou des objets :
local function get_user()
return "Alexey", 25, "frontend"
end
local name, age, role = get_user()
print(name) -- "Alexey"
print(role) -- "frontend"Lignes : concaténation via ..
Oubliez + pour les lignes. Dans Lua, la concaténation est .. :
local first = "Hello"
local second = "World"
print(first .. " " .. second) -- "Hello World"
-- Длина строки
print(# "Kodik") - 10 (octets UTF-8, pas de caractères !)
-- string.format — как printf, только в Lua
local msg = string.format("%s %d HP", "hero", 100)
print(msg) -- "The hero has 100 HP"Important : l'opérateur # renvoie la longueur en octets, et non en caractères. Pour le cyrillique, c'est un piège : chaque lettre prend 2 octets en UTF-8.
OOPS : collecte à partir de tableaux et de métatables
Dans Lua, il n'y a pas de classes prédéfinies. Mais il y a métatables — mécanisme par lequel on peut réaliser l'héritage, la surcharge des opérateurs et, en général, tout modèle objet :
-- "Class" через таблицу
local Player = {}
Player.__index = Player
function Player.new(name, hp)
local self = setmetatable({}, Player)
self.name = name
self.hp = hp
return self
end
function Player:take_damage(amount)
self.hp = self.hp - amount
if self.hp <= 0 then
print(self.name .. " defeated!")
else
print(self.name .. ": remaining " .. self.hp .. " HP")
end
end
-- Использование
local hero = Player.new("Geralt", 100)
hero:take_damage(30) -- "Geralt: 70 HP left"
hero:take_damage(80) -- "Geralt is defeated!"Faites attention à deux-points (:) est un sucre syntaxique. hero:take_damage(30) équivaut à hero.take_damage(hero, 30). Les deux-points transmettent automatiquement self.
Des jetons qui surprennent
Affectation multiple :
local a, b = 10, 20
a, b = b, a -- swap без временной переменной!
print(a, b) -- 20, 10Ternaire via and/or :
-- В Lua нет ternary operator, но есть хак:
local status = (hp > 0) and "alive" or "dead"Varargs — nombre variable d'arguments :
local function sum(...)
local total = 0
for _, v in ipairs({...}) do
total = total + v
end
return total
end
print(sum(1, 2, 3, 4, 5)) -- 15Où Lua est-il utilisé en ce moment ?
Lua n'est pas une pièce de musée. Il fonctionne dans le produit pour des milliards d'utilisateurs :
Roblox - tous les scripts de jeu sur Luau (fork Lua)
Neovim — les configurations et les plugins sont écrits en Lua, pas en VimScript
Redis — scripts pour les opérations atomiques
NGINX/OpenResty — passerelles API à forte charge
World of Warcraft - des addons écrits par des millions de joueurs
Systèmes embarqués — Appareils IoT où chaque kilo-octet compte
Vous voulez consolider vos connaissances ? Pratiquez !
La théorie sans pratique est oubliée en une semaine, c'est un fait. Si vous voulez vraiment comprendre la programmation, et pas seulement lire l'article et fermer l'onglet, essayez Code.
Code est une application pour apprendre la programmation en mettant l'accent sur la pratique. Ici, vous ne vous contentez pas de lire la théorie : vous résolvez des problèmes, écrivez du code et voyez immédiatement le résultat. Les cours de Python, JavaScript, HTML, CSS et autres technologies sont conçus pour que vous puissiez apprendre à votre propre rythme, depuis votre téléphone ou votre ordinateur.
Et nous avons aussi Communauté Telegram avec plus de 2000 développeurs, où des articles utiles sur la programmation sont régulièrement publiés. C'est un excellent moyen de réviser la matière dans un format pratique : vous faites défiler le fil d'actualité et en même temps vous approfondissez vos connaissances. Abonnez-vous et apprenez avec nous.
Total
Lua est un langage qui prouve qu'il n'est pas nécessaire d'être complexe pour être puissant. 8 types de données, une structure de données, une syntaxe minimaliste - et pourtant il fonctionne dans les game devs, les serveurs Web, les bases de données et les systèmes embarqués.
Si vous avez déjà rêvé d'écrire un mod pour votre jeu préféré, de créer un plugin pour Neovim ou si vous voulez simplement apprendre une langue en un week-end, Lua est un excellent choix. La barrière à l'entrée est minime et les possibilités sont assez sérieuses.
print("Good luck learning Lua!")