Cheat sheet Lua
Cập nhật lần cuối
Hello World và chạy code
Lua rất tối giản: chỉ một câu lệnh là chạy được.
| Thao tác | Cú pháp |
|---|---|
| In ra một dòng | print("Hello, World!") |
| In nhiều giá trị | print("x", 1, true) |
| Ghi không xuống dòng | io.write("Hi") |
| Chú thích | -- this is a comment |
| Chú thích nhiều dòng | --[[ ... ]] |
| Nối chuỗi | print("Hi " .. name) |
| Chạy một tệp | lua app.lua |
| Shell tương tác | lua |
Biến và kiểu dữ liệu
Mặc định biến là toàn cục; khai báo biến cục bộ bằng local.
| Thao tác | Cú pháp |
|---|---|
| Biến cục bộ | local age = 30 |
| Biến toàn cục | count = 0 |
| Gán nhiều biến cùng lúc | local a, b = 1, 2 |
| Tám kiểu dữ liệu | nil, boolean, number, string, table, function, userdata, thread |
| Nil / boolean | nil, true, false |
| Kiểm tra kiểu | type(x) trả về "number" |
| Chuyển sang số | tonumber("42") |
| Chuyển sang chuỗi | tostring(42) |
Chuỗi
Chuỗi là bất biến; dùng nháy đơn hay nháy kép đều được.
| Thao tác | Cú pháp |
|---|---|
| Độ dài | #s hoặc string.len(s) |
| Nối chuỗi | s1 .. s2 |
| Chữ hoa / chữ thường | s:upper(), s:lower() |
| Chuỗi con | s:sub(1, 3) |
| Tìm chuỗi con | s:find("ell") |
| Thay thế (gsub) | s:gsub("a", "b") |
| Định dạng | string.format("%05d", 42) |
| Chuỗi dài | [[ multi\nline ]] |
Table (cấu trúc dữ liệu cốt lõi)
Table là kiểu có cấu trúc duy nhất của Lua: nó đóng vai trò mảng, map và đối tượng.
| Thao tác | Cú pháp |
|---|---|
| Table rỗng | local t = {} |
| Kiểu mảng (chỉ số bắt đầu từ 1) | local t = {10, 20, 30} |
| Truy cập phần tử mảng | t[1] (phần tử đầu tiên) |
| Table kiểu map | local u = {name = "Ada", age = 30} |
| Truy cập giá trị trong map | u.name hoặc u["name"] |
| Gán giá trị | t[4] = 40, u.email = "a@x.com" |
| Độ dài phần mảng | #t |
| Duyệt mảng (ipairs) | for i, v in ipairs(t) do ... end |
| Duyệt mọi khóa (pairs) | for k, v in pairs(u) do ... end |
| Table lồng nhau | local m = {a = {1, 2}} |
Luồng điều khiển
Khối lệnh kết thúc bằng end; chỉ nil và false được coi là sai.
| Thao tác | Cú pháp |
|---|---|
| If / elseif / else | if x > 0 then ... elseif x < 0 then ... else ... end |
| Toán tử logic | and, or, not |
| Vòng lặp for theo số | for i = 1, 10 do ... end |
| Vòng lặp for có bước nhảy | for i = 10, 1, -1 do ... end |
| Vòng lặp while | while x < 100 do ... end |
| Repeat-until | repeat ... until done |
| Break | break |
| Toán tử khác | if a ~= b then ... end |
Hàm
Hàm là giá trị hạng nhất (first-class) và có thể trả về nhiều kết quả.
| Thao tác | Cú pháp |
|---|---|
| Định nghĩa hàm | function add(a, b) return a + b end |
| Hàm cục bộ | local function square(x) return x * x end |
| Hàm ẩn danh | local f = function(x) return x * 2 end |
| Trả về nhiều giá trị | function bounds() return 1, 10 end |
| Nhận nhiều giá trị trả về | local lo, hi = bounds() |
| Hàm nhận số lượng đối số tùy ý | function sum(...) ... end |
| Gom các đối số vararg | local args = {...} |
| Phương thức (cú pháp dấu hai chấm) | function obj:greet() ... end |
Thư viện string
Các hàm thường dùng trong thư viện string (gọi được theo kiểu s:fn()).
| Hàm | Tác dụng |
|---|---|
string.len(s) | Độ dài chuỗi |
string.sub(s, i, j) | Chuỗi con từ chỉ số i đến j |
string.upper(s) | Bản sao viết hoa |
string.rep(s, n) | Lặp lại chuỗi n lần |
string.find(s, p) | Tìm mẫu, trả về vị trí đầu/cuối |
string.match(s, p) | Trả về kết quả khớp mẫu đầu tiên |
string.gsub(s, p, r) | Thay thế mọi kết quả khớp mẫu |
string.format(fmt, ...) | Định dạng các giá trị thành chuỗi |
Thư viện table và math
Các hàm hỗ trợ làm việc với table kiểu mảng và với số.
| Hàm | Tác dụng |
|---|---|
table.insert(t, v) | Thêm giá trị vào cuối |
table.insert(t, i, v) | Chèn v vào vị trí i |
table.remove(t, i) | Xóa và trả về phần tử ở vị trí i |
table.concat(t, ", ") | Nối các phần tử thành chuỗi |
table.sort(t) | Sắp xếp mảng tại chỗ |
math.floor(x) / math.ceil(x) | Làm tròn xuống / lên |
math.max(...) / math.min(...) | Đối số lớn nhất / nhỏ nhất |
math.random(1, 6) | Số nguyên ngẫu nhiên trong một khoảng |
Metatable (tóm tắt)
Metatable cho phép bạn tùy chỉnh cách table hoạt động: toán tử, truy cập chỉ số và nhiều hơn nữa.
| Thao tác | Cú pháp |
|---|---|
| Gán metatable | setmetatable(t, mt) |
| Lấy metatable | getmetatable(t) |
| Giá trị dự phòng cho khóa không tồn tại | mt.__index = defaults |
| Giá trị mặc định qua hàm | mt.__index = function(t, k) ... end |
| Tùy chỉnh phép cộng | mt.__add = function(a, b) ... end |
| Tùy chỉnh tostring | mt.__tostring = function(t) ... end |
| OOP dựa trên prototype | mt.__index = ClassTable |
Những cú pháp Lua bạn dùng nhiều nhất, gói gọn trong một trang. Cheat sheet Lua này là bảng tra cứu nhanh phần cốt lõi của ngôn ngữ: biến và kiểu dữ liệu, chuỗi, luồng điều khiển, hàm, và table, cấu trúc dữ liệu duy nhất và linh hoạt của Lua, kèm phần giới thiệu nhanh về thư viện chuẩn và metatable.
Mọi thứ ở đây đều là Lua chuẩn và chạy được trên trình thông dịch mặc định. Sao chép đoạn bạn cần, hoặc chạy thử từng đoạn code ngay trong playground Lua, không cần cài đặt.
Câu hỏi thường gặp về cheat sheet Lua
Cheat sheet Lua này có miễn phí không?
Có. Cheat sheet Lua này hoàn toàn miễn phí và không cần đăng ký. Lưu trang lại và quay lại bất cứ khi nào bạn cần tra một thao tác với table, một hàm xử lý chuỗi hay một từ khóa điều khiển luồng.
Vì sao table trong Lua vừa là mảng vừa là map?
{10, 20, 30}), table hoạt động như mảng; khi dùng khóa là chuỗi ({name = "Ada"}), nó hoạt động như map. Bạn thậm chí có thể dùng cả hai trong cùng một table. Vì vậy Lua chỉ cần một kiểu có cấu trúc: table đảm nhận cả mảng, từ điển, tập hợp và đối tượng.Vì sao chỉ số trong Lua bắt đầu từ 1?
t[1] là phần tử đầu tiên và #t là số phần tử. Toán tử độ dài # và các hàm thư viện như table.insert hay ipairs đều dựa trên quy ước bắt đầu từ 1 này, nên tuân theo nó giúp code xử lý mảng của bạn chạy đúng như mong đợi.Có thể luyện tập Lua online không?
Có. Mở playground Lua để chạy bất kỳ đoạn code nào trong cheat sheet này ngay trên trình duyệt, không cần cài Lua. Khi muốn học có lộ trình, khóa học Lua tương tác miễn phí của Coddy dẫn bạn từng bước từ biến và table đến hàm và metatable.
Cheat sheet này có phù hợp cho người mới bắt đầu không?
Có. Nội dung được sắp xếp từ các chủ đề phổ biến nhất (biến, chuỗi, table, luồng điều khiển) đến các chủ đề nâng cao (thư viện chuẩn và metatable), nên ngay ngày đầu bạn đã dùng được các phần trên cùng, rồi dần làm chủ phần còn lại.