Tổng quan về Lua
Mục đích thiết kế: Cung cấp khả năng mở rộng linh hoạt cho ứng dụng
- Độ nhẹ
- Khả năng mở rộng
- Hướng thủ tục
- Quản lý bộ nhớ tự động
- Builtin pattern matching
- Closure (hỗ trợ trừu tượng dữ liệu, hàm ảo, kế thừa và overload)
Ứng dụng phổ biến
- Phát triển game
- Script ứng dụng độc lập
- Web application scripting
- Mở rộng và plugin cơ sở dữ liệu
- Hệ thống an ninh (IDS)
Ví dụ Hello World
print("xin chào, Lua")
os.execute("lua hello.lua")
Chú thích
- -- Chú thích một dòng
- --[[ Chú thích nhiều dòng --]]
Biến toàn cục
Mặc định không có tiền tố là biến toàn cục
Kiểu dữ liệu
- nil: giá trị vô hiệu
- boolean: true/false (nil cũng là false)
- number: double precision
- string: hỗ trợ chuỗi đa dòng [[...]], toán tử + chuyển đổi sang số, .. nối chuỗi, # tính độ dài
- function: giá trị thứ nhất, có thể là hàm ẩn danh
- userdata: cấu trúc C
- thread: coroutine
- table: mảng liên kết, chỉ số bắt đầu từ 1
Biến
-- Biến toàn cục
giaTri = 5
-- Biến cục bộ
local giaTri = 5
-- Gán đa giá trị
a, b = 1, 2
a, b = b, a
a, b = hamTraVeHaiGiaTri()
Thao tác bảng
trangWeb = {}
trangWeb['diaChi'] = 'www.google.com'
print(trangWeb.diaChi)
Vòng lặp
-- Vòng while
while giaTri > 0 do
print(giaTri)
giaTri = giaTri - 1
end
-- Vòng for số học
for index = 1, 10, 2 do
print(index)
end
-- Vòng for tổng quát
for khoa, giaTri in pairs(bangDuLieu) do
print(khoa, giaTri)
end
Quyết định
if dieuKien then
if dieuKienCon then
print("Đúng")
end
else
print("Sai")
end
Hàm
function tinhTong(a, b)
return a + b
end
print(tinhTong(3,4))
Thao tác chuỗi
- string.upper()
- string.gsub()
- string.reverse()
- string.format()
- string.rep()
Mảng
mangMotChieu = {"A", "B"}
mangHaiChieu = {{1,2}, {3,4}}
for i = 1, #mangHaiChieu do
for j = 1, #mangHaiChieu[i] do
print(mangHaiChieu[i][j])
end
end
Iterator
for khoa, giaTri in ipairs(mang) do
print(khoa, giaTri)
end
Table
bang = {ten = "Nguyen Van A", tuoi = 25}
table.insert(bang, "moi")
table.remove(bang, 1)
table.sort(bang)
Mô-đun
modun = {}
modun.hangSo = "Giá trị cố định"
function modun.hamCong()
print("Hàm công khai")
end
local function hamTu()
print("Hàm riêng tư")
end
function modun.goiHamTu()
hamTu()
end
return modun
Metatable
setmetatable(bang, {
__index = function(t, k)
return "Giá trị mặc định"
end
})
Coroutine
coroutine.create(function()
print("Coroutine đang chạy")
end)
I/O
-- Đọc file
file = io.open("duLieu.txt", "r")
print(file:read())
file:close()
-- Ghi file
file = io.open("ketQua.txt", "w")
file:write("Nội dung mới")
file:close()
Xử lý lỗi
pcall(hamCoiNghi)
xpcall(hamCoiNghi, hamXuLy)
Database
require "luasql.mysql"
env = luasql.mysql()
conn = env:connect("tenCSDL", "taiKhoan", "matKhau", "diaChi", 3306)
conn:execute("SET NAMES UTF8")
cur = conn:execute("SELECT * FROM bangDuLieu")
file = io.open("ketQua.txt", "w+")
while row do
file:write(string.format("%d %s\n", row.id, row.ten))
row = cur:fetch(row, "a")
end
file:close()
conn:close()
env:close()