Lua 快速入门教程
本教程将带你从0到1掌握Lua编程语言的核心操作,通过知识点解析+代码示例的形式,让你轻松理解并应用Lua。
目录
环境准备与基础概念
Lua简介
Lua是一种轻量级、高效的脚本语言,由巴西里约热内卢天主教大学的研究人员于1993年开发。它的设计目标是嵌入应用程序中,为应用程序提供灵活的扩展和定制功能。Lua具有以下特点:
- 轻量级:Lua解释器的源代码非常精简,编译后只有几百KB
- 可扩展性:易于与C/C++等语言集成
- 高效:Lua的虚拟机实现非常高效
- 灵活:动态类型、闭包、函数作为一等公民等特性
安装Lua
在Windows系统上,可以从Lua官网下载预编译的二进制文件,或者使用包管理器如Chocolatey安装。 或者下载编译好的文件 luabinaries.sourceforge.net/download.ht…
在Linux/Mac系统上,可以使用系统包管理器安装:
# Ubuntu/Debian
sudo apt-get install lua5.4
# CentOS/RHEL
sudo yum install lua
# macOS (使用Homebrew)
brew install lua
运行Lua程序
创建一个Lua文件(例如test.lua),然后使用lua命令运行:
lua test.lua
也可以直接在命令行中进入Lua交互模式:
lua
变量与数据类型
Lua是动态类型语言,变量不需要声明类型。Lua有8种基本数据类型:
- nil:表示无效值
- boolean:布尔值,true或false
- number:数字(整数和浮点数统一表示)
- string:字符串
- table:表,Lua中唯一的数据结构
- function:函数
- userdata:用户数据
- thread:线程
变量声明
在Lua中,变量声明不需要关键字,可以直接赋值:
-- 全局变量
x = 10
y = "Hello Lua"
z = true
n = nil
如果要声明局部变量,需要使用local关键字:
local x = 10
local y = "Hello Lua"
字符串操作
Lua的字符串可以使用单引号或双引号表示:
local str1 = 'Hello'
local str2 = "Lua"
字符串连接使用..操作符:
local str3 = str1 .. " " .. str2 -- 结果为 "Hello Lua"
字符串长度使用#操作符:
local len = #str3 -- 结果为 9
控制结构
条件语句
Lua的if语句结构如下:
if 条件1 then
-- 代码块1
elseif 条件2 then
-- 代码块2
else
-- 代码块3
end
示例:
a = 10
if a > 5 then
print("a > 5")
elseif a == 5 then
print("a == 5")
else
print("a < 5")
end
循环结构
while循环
while 条件 do
-- 代码块
end
示例:
local a = 10
while a >= 5 do
print(a)
a = a - 1
end
print("final a=", a)
for循环
数值for循环:
for var = start, end, step do
-- 代码块
end
示例:
for i = 1, 5 do
print("i=", i)
end
-- 带步长的for循环
for i = 5, 1, -1 do
print("i=", i)
end
泛型for循环(用于遍历表):
for key, value in pairs(table) do
-- 代码块
end
示例:
for k, v in pairs({1, 2, 3, 4, 5}) do
print("p=>", k, v)
end
表(Table)
表是Lua中唯一的数据结构,它既可以用作数组,也可以用作字典。
数组
-- 创建数组
local arr = {1, 2, 3}
-- 访问数组元素
for i = 1, #arr do
print(arr[i])
end
字典
-- 创建字典
local dict = {
name = "kimi",
age = 23
}
-- 访问字典元素
print(dict.name) -- 点语法
print(dict["age"]) -- 索引语法
表的常用操作
local t = {1, 2, 3, 4, 5}
-- 获取表长度
print(#t) -- 输出 5
-- 添加元素
t[6] = 6
-- 删除元素
t[3] = nil
-- 遍历表
for i, v in ipairs(t) do -- ipairs用于遍历数组部分
print(i, v)
end
for k, v in pairs(t) do -- pairs用于遍历所有键值对
print(k, v)
end
函数
函数定义
function 函数名(参数列表)
-- 函数体
return 返回值
end
示例:
function add(a, b)
return a + b
end
print(add(1, 23)) -- 输出 24
也可以使用匿名函数:
local add = function(a, b)
return a + b
end
函数参数
Lua函数的参数是按值传递的,支持可变参数:
function sum(...)
local args = {...}
local result = 0
for _, v in ipairs(args) do
result = result + v
end
return result
end
print(sum(1, 2, 3, 4, 5)) -- 输出 15
闭包
Lua支持闭包,即函数可以访问其外部作用域的变量:
function createCounter()
local count = 0
return function()
count = count + 1
return count
end
end
local counter = createCounter()
print(counter()) -- 输出 1
print(counter()) -- 输出 2
print(counter()) -- 输出 3
模块系统
Lua的模块是一个定义了函数和变量的表,可以通过require加载。
创建模块
创建一个名为module1.lua的文件:
-- module1.lua
function hello()
print("hello from module1")
end
return {
hello = hello
}
使用模块
在另一个Lua文件中使用该模块:
-- 加载模块
local module1 = require("module1")
-- 调用模块中的函数
module1.hello()
元表与元方法
元表(Metatable)是Lua中实现面向对象编程和运算符重载的关键机制。
设置元表
local t1 = {}
local t2 = {}
setmetatable(t1, t2)
元方法
元方法是元表中定义的特殊函数,用于处理特定操作:
local mt = {}
-- 加法元方法
mt.__add = function(a, b)
return a.value + b.value
end
-- 设置元表
local t1 = {value = 10}
local t2 = {value = 20}
setmetatable(t1, mt)
setmetatable(t2, mt)
-- 使用重载的加法运算符
print(t1 + t2) -- 输出 30
常用的元方法包括:
__add:加法__sub:减法__mul:乘法__div:除法__index:索引访问__newindex:索引赋值__tostring:字符串表示
文件操作
打开文件
-- 打开文件
local file = io.open("test.txt", "r") -- r表示读取模式
文件模式包括:
r:只读w:只写(创建新文件)a:追加r+:读写w+:读写(创建新文件)a+:读写(追加)
读写文件
-- 读取文件
local content = file:read("*a") -- 读取全部内容
-- 写入文件
file:write("Hello Lua")
-- 关闭文件
file:close()
错误处理
断言
local function divide(a, b)
assert(b ~= 0, "除数不能为零")
return a / b
end
divide(10, 0) -- 抛出错误:除数不能为零
异常捕获
local function safeDivide(a, b)
local status, result = pcall(function()
return a / b
end)
if status then
return result
else
return nil, result
end
end
local result, err = safeDivide(10, 0)
if not result then
print("错误:", err)
end
实践案例
案例1:实现一个简单的计算器
-- calculator.lua
local calculator = {}
function calculator.add(a, b)
return a + b
end
function calculator.subtract(a, b)
return a - b
end
function calculator.multiply(a, b)
return a * b
end
function calculator.divide(a, b)
if b == 0 then
error("除数不能为零")
end
return a / b
end
return calculator
案例2:实现一个简单的栈
-- stack.lua
local Stack = {}
Stack.__index = Stack
function Stack.new()
local self = {}
setmetatable(self, Stack)
self.items = {}
return self
end
function Stack:push(item)
table.insert(self.items, item)
end
function Stack:pop()
return table.remove(self.items)
end
function Stack:peek()
return self.items[#self.items]
end
function Stack:size()
return #self.items
end
function Stack:isEmpty()
return #self.items == 0
end
return Stack
总结
本教程介绍了Lua编程语言的核心概念和基本语法,包括变量、数据类型、控制结构、表、函数、模块等。Lua是一种轻量级但功能强大的脚本语言,广泛应用于游戏开发、嵌入式系统、Web应用等领域。通过学习本教程,你已经掌握了Lua的基础知识,可以开始编写简单的Lua程序了。
要进一步学习Lua,建议查阅Lua官方文档,并通过实践项目来巩固所学知识。