あなたはロブロックス、ワールド・オブ・ウォークラフト、ゲリーズモッドをプレイしたり、nginxをいじったりしていましたが、その間ずっとユーザルを使用していたとは知りませんでした Lua。普通に知り合う時が来ました。
Luaは、誰もが「ああ、これはゲーム用だ」と言う言語ですが、実際にはRedis、NGINX(OpenResty)、Wireshark、Neovimなど、高速で簡単に組み込み可能なスクリプトエンジンが必要な多くの場所で使用されています。
Luaインタプリタ全体の重さ 300KB未満Luaは、最も高速なスクリプト言語のトップに常にランクインしています(LuaJITは、一部のベンチマークではCレベルで動作します)。

変数:シンプルですが、ニュアンスがあります
Lua のデフォルト変数 グローバルはい、"use strict"までのJavaScriptのように。そして、はい、これは罠です。
-- Это глобальная переменная. Она видна ОТОВСЮДУ.
name = "Code"
-- А вот так — локальная. Используй local ВСЕГДА.
local age = 25
local is_cool = trueルール1: いつでも書いてください local.もし忘れた場合、変数はグローバルスコープに流れ込み、その後、counterがランダムな場所にリセットされる理由を2時間デバッグすることになります。
データの種類:ミニマリズムの全貌
Lua の合計 8種類8. 比較すると、TypeScriptには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 (да, функции — это значения)最も重要なことは: table は唯一のデータ構造です。配列?テーブル。オブジェクト?テーブル。辞書?それもテーブルです。HashMap?当ててみてください。
表:すべてを統治するための1つのタイプ
Luaのテーブルはスイスナイフです。見てください。
-- Как массив (индексация с 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
}1からのインデックス - これが、C、Python、JSの開発者が最初の30分間石の顔で歩く理由です。でも、そのうち慣れます。約束します。
条件とサイクル:ジャンルの定番
中括弧は使用しないでください。elifも使用しないでください。単に if、elseif、then、および 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")
endサイクルも驚きはありません。
-- Числовой 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)
end痛みの瞬間: Lua にはありません +=, -=, ++. 2003年のように毎回count = count + 1を書きます。複合演算子を追加する提案がありますが、今は我慢してください。
機能:ファーストクラス市民
Luaの関数は完全な値です。それらは変数に保存したり、引数として渡したり、他の関数から返したりできます。
-- Обычная функция
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 はサポートしています 複数の戻り値 — 配列やオブジェクトに包まれていません。
local function get_user()
return "Alexey", 25, "frontend"
end
local name, age, role = get_user()
print(name) -- "Alexey"
print(role) -- "frontend"行:..を介した連結
文字列の+は忘れてください。Lua では、連結は .. です。
local first = "Hello"
local second = "World"
print(first .. " " .. second) -- "Hello World"
-- Длина строки
print(# "コード") -- 10 (UTF-8 バイト、文字ではありません!)
-- string.format — как printf, только в Lua
local msg = string.format("%s %d HP", "hero", 100)
print(msg) -- "The hero has 100 HP"重要: オペレーター # は長さを返します バイト文字数ではなく、バイト数で計算します。キリル文字の場合、これは罠です。各文字はUTF-8で2バイトを占めます。
OOP: テーブルとメタテーブルから収集する
Luaには箱から出すクラスはありません。しかし、 メタテーブル - 継承、オペレーターのオーバーロード、および一般的に任意のオブジェクトモデルを実装できるメカニズム:
-- "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!"注意してください コロン (:) は構文のシュガーです。hero:take_damage(30)はhero.take_damage(hero, 30)と同等です。コロンは自動的に self を送信します。
驚きのチップ
複数の割り当て:
local a, b = 10, 20
a, b = b, a -- swap без временной переменной!
print(a, b) -- 20, 10and/orを介したTernarnik:
-- В Lua нет ternary operator, но есть хак:
local status = (hp > 0) and "alive" or "dead"Varargs — 可変数の引数:
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)) -- 15Luaは現在どこで使用されていますか?
Luaは博物館の展示品ではありません。これは、数十億人のユーザーの製品で動作します。
Roblox — Luauのゲームスクリプト全体(Luaフォーク)
Neovim — 構成とプラグインは VimScript ではなく Lua で書かれています
Redis — 原子操作のためのスクリプト
NGINX/OpenResty — 高負荷のAPIゲートウェイ
World of Warcraft — 何百万人ものプレイヤーが書くアドオン
組み込みシステム — すべてのキロバイトが重要なIoTデバイス
練習して、理解を深めましょう
実践なしの理論は1週間で忘れられます。これは事実です。記事を読んでタブを閉じるだけでなく、プログラミングを本当に理解したい場合は、試してみてください コディック.
コディック は、実践に重点を置いたプログラミング学習アプリです。理論を読むだけでなく、問題を解き、コードを書いて、すぐに結果を確認できます。Python、JavaScript、HTML、CSSなどのコースは、スマートフォンやパソコンを使って、自分のペースで学べるように構成されています。
また、当社には Telegramコミュニティ 2000人以上の開発者が、プログラミングに関する役立つ投稿を定期的に公開しています。これは、便利な形式で資料を繰り返す素晴らしい方法です。テープをめくると同時に、知識を吸収します。チャンネル登録して、一緒に学びましょう。
合計
Luaは、強力であるために複雑である必要はないことを証明する言語です。8種類のデータ、1つのデータ構造、ミニマリスト構文、さらにゲームデベ、Webサーバー、データベース、組み込みシステムで動作します。
お気に入りのゲームのMODを書いたり、Neovimのプラグインを作ったり、週末に言語を学びたいと夢見たことがあるなら、Luaは素晴らしい選択です。入門のハードルは最小限で、可能性は非常に大きいです。
print("Good luck learning Lua!")