Lua チートシート
最終更新
Hello World とコードの実行
Lua は最小限で、1 つの文で動きます。
| 操作 | 構文 |
|---|---|
| 1 行を出力 | print("Hello, World!") |
| 複数の値を出力 | print("x", 1, true) |
| 改行なしで書き出す | io.write("Hi") |
| コメント | -- this is a comment |
| 複数行コメント | --[[ ... ]] |
| 文字列を連結 | print("Hi " .. name) |
| ファイルを実行 | lua app.lua |
| 対話シェル | lua |
変数と型
変数は既定でグローバルです。ローカルは local で宣言します。
| 操作 | 構文 |
|---|---|
| ローカル変数 | local age = 30 |
| グローバル変数 | count = 0 |
| 複数代入 | local a, b = 1, 2 |
| 8 つの型 | nil, boolean, number, string, table, function, userdata, thread |
| nil / 真偽値 | nil, true, false |
| 型を調べる | type(x) は "number" を返す |
| 数値に変換 | tonumber("42") |
| 文字列に変換 | tostring(42) |
文字列
文字列は不変で、単一引用符も二重引用符も使えます。
| 操作 | 構文 |
|---|---|
| 長さ | #s または string.len(s) |
| 連結 | s1 .. s2 |
| 大文字 / 小文字 | s:upper(), s:lower() |
| 部分文字列 | s:sub(1, 3) |
| 部分文字列を探す | s:find("ell") |
| 置換 (gsub) | s:gsub("a", "b") |
| 書式設定 | string.format("%05d", 42) |
| 長い文字列 | [[ multi\nline ]] |
テーブル (中核のデータ構造)
テーブルは Lua 唯一の構造型で、配列、マップ、オブジェクトとして働きます。
| 操作 | 構文 |
|---|---|
| 空のテーブル | local t = {} |
| 配列形式 (1 始まり) | local t = {10, 20, 30} |
| 配列要素にアクセス | t[1] (最初の要素) |
| マップ形式のテーブル | local u = {name = "Ada", age = 30} |
| マップの値にアクセス | u.name または u["name"] |
| 値を設定 | t[4] = 40, u.email = "a@x.com" |
| 配列部分の長さ | #t |
| 配列を反復 (ipairs) | for i, v in ipairs(t) do ... end |
| すべてのキーを反復 (pairs) | for k, v in pairs(u) do ... end |
| ネストしたテーブル | local m = {a = {1, 2}} |
制御フロー
ブロックは end で閉じます。偽となるのは nil と false だけです。
| 操作 | 構文 |
|---|---|
| if / elseif / else | if x > 0 then ... elseif x < 0 then ... else ... end |
| 論理演算子 | and, or, not |
| 数値 for | for i = 1, 10 do ... end |
| ステップ付きの for | for i = 10, 1, -1 do ... end |
| while ループ | while x < 100 do ... end |
| repeat-until | repeat ... until done |
| break | break |
| 不等価演算子 | if a ~= b then ... end |
関数
関数は第一級の値で、複数の結果を返せます。
| 操作 | 構文 |
|---|---|
| 関数を定義 | function add(a, b) return a + b end |
| ローカル関数 | local function square(x) return x * x end |
| 無名関数 | local f = function(x) return x * 2 end |
| 複数の戻り値 | function bounds() return 1, 10 end |
| 複数の戻り値を受け取る | local lo, hi = bounds() |
| 可変長引数の関数 | function sum(...) ... end |
| 可変長引数を集める | local args = {...} |
| メソッド (コロン構文) | function obj:greet() ... end |
string ライブラリ
string ライブラリのよく使う関数 (s:fn() の形でも呼べる)。
| 関数 | 機能 |
|---|---|
string.len(s) | 文字列の長さ |
string.sub(s, i, j) | インデックス i から j までの部分文字列 |
string.upper(s) | 大文字にしたコピー |
string.rep(s, n) | 文字列を n 回繰り返す |
string.find(s, p) | パターンを探し、開始/終了位置を返す |
string.match(s, p) | 最初のパターンの一致を返す |
string.gsub(s, p, r) | パターンの一致をすべて置換 |
string.format(fmt, ...) | 値を文字列に整形 |
table と math ライブラリ
配列形式のテーブルや数値を扱うためのヘルパー。
| 関数 | 機能 |
|---|---|
table.insert(t, v) | 末尾に値を追加 |
table.insert(t, i, v) | 位置 i に v を挿入 |
table.remove(t, i) | 位置 i の要素を削除して返す |
table.concat(t, ", ") | 要素を文字列に連結 |
table.sort(t) | 配列をその場でソート |
math.floor(x) / math.ceil(x) | 切り下げ / 切り上げ |
math.max(...) / math.min(...) | 最大 / 最小の引数 |
math.random(1, 6) | 範囲内のランダムな整数 |
メタテーブル (簡潔に)
メタテーブルを使うと、演算子やインデックス参照など、テーブルの振る舞いをカスタマイズできます。
| 操作 | 構文 |
|---|---|
| メタテーブルを設定 | setmetatable(t, mt) |
| メタテーブルを取得 | getmetatable(t) |
| 存在しないキーのフォールバック | mt.__index = defaults |
| 関数によるデフォルト | mt.__index = function(t, k) ... end |
| 加算をカスタマイズ | mt.__add = function(a, b) ... end |
| tostring をカスタマイズ | mt.__tostring = function(t) ... end |
| プロトタイプベースのオブジェクト指向 | mt.__index = ClassTable |
最もよく使う Lua の構文を 1 ページにまとめました。この Lua チートシートは、言語の中核のクイックリファレンスです。変数と型、文字列、制御フロー、関数、そして Lua の唯一で柔軟なデータ構造として働くテーブルを収録し、さらに標準ライブラリとメタテーブルにも触れます。
ここに載っているものはすべて標準の Lua で、素のインタープリタで動きます。必要なものをコピーするか、Lua プレイグラウンドですべてのスニペットをその場で試してみてください。インストールは不要です。
Lua チートシート よくある質問
この Lua チートシートは無料ですか?
はい。この Lua チートシートは完全に無料で、登録も不要です。ブックマークしておけば、テーブル操作や文字列関数、制御フローのキーワードを調べたいときにいつでも戻ってこられます。
なぜ Lua のテーブルは配列でもありマップでもあるのですか?
テーブルは単なるキーと値のペアの集まりで、キーには任意の値を使えます。1 から始まる連続した整数のキーを使うと (
{10, 20, 30})、テーブルは配列のようにふるまい、文字列のキーを使うと ({name = "Ada"})、マップのようにふるまいます。同じテーブルで両方を混在させることさえできます。だからこそ Lua には構造型が 1 つで足りるのです。テーブルが配列、辞書、集合、オブジェクトをまかないます。なぜ Lua は 1 始まりのインデックスを使うのですか?
慣習と設計により、Lua の配列はインデックス 0 ではなく 1 から始まります。
t[1] が最初の要素で、#t が個数です。長さ演算子 # や table.insert、ipairs といったライブラリ関数はすべてこの 1 始まりの慣習を前提とするので、これを守れば配列のコードが期待どおりに動き続けます。Lua をオンラインで練習できますか?
はい。Lua プレイグラウンドを開けば、このチートシートのどのスニペットもブラウザ上で実行できます。Lua のインストールは不要です。体系的に学びたいときは、Coddy の無料インタラクティブ Lua コースが、変数とテーブルから関数、メタテーブルまで段階的に導いてくれます。
このチートシートは初心者に向いていますか?
はい。最もよく使うトピック (変数、文字列、テーブル、制御フロー) から高度なもの (標準ライブラリとメタテーブル) へと並べてあるので、初日から上のセクションを使い、残りには慣れながら進めます。