Lua 教程 - 第一章:Lua 入门基础
第一章:Lua 入门基础
欢迎开始 Lua 学习之旅!Lua 是一种轻量级、高效且可嵌入的脚本语言。它的设计目标是作为一种扩展语言,嵌入到应用程序中,为其提供脚本功能。
1.1 简介
Lua 的历史与发展
Lua 诞生于 1993 年,由巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)的 Roberto Ierusalimschy、Luiz Henrique de Figueiredo 和 Waldemar Celes 创建。“Lua” 在葡萄牙语中是“月亮”的意思。
Lua 的特点与应用场景
轻量级: Lua 的源码非常精简,编译后的二进制文件也很小,非常适合嵌入式设备。
高效: Lua 拥有极高的执行效率,是目前速度最快的脚本语言之一。
可扩展: Lua 提供了易于使用的 C API,方便与其他语言(如 C/C++)进行交互。
应用场景:
游戏开发: 魔兽世界(World of Warcraft)、愤怒的小鸟(Angry Birds)、Roblox 等都大量使用了 Lua。
嵌入式 ...
Lua 教程 - 第二章:数据类型与值
第二章:数据类型与值
在 Lua 中,值(Value)是一等公民,而变量本身没有类型,只有值才有类型。这意味着你可以将任何类型的值赋给任何变量。Lua 是一种动态类型语言,这为编程带来了极大的灵活性。
本章将详细介绍 Lua 的 8 种基本数据类型,并深入探讨字符串和表(Table)的基础用法。
2.1 基本数据类型
Lua 包含以下 8 种基本数据类型:
类型
描述
nil
空值,表示无效值。
boolean
布尔值,包含 true 和 false。
number
数字,Lua 5.3+ 支持整数和浮点数。
string
字符串,字符序列。
function
函数,由 C 或 Lua 编写。
userdata
用户数据,用于存储 C 数据结构。
thread
线程,用于协程(Coroutine)。
table
表,Lua 中唯一的数据结构。
我们可以使用 type() 函数来检查值的类型:
print(type("Hello")) -- string
print(type(10)) -- number
print(ty ...
Lua 教程 - 第三章:流程控制
第三章:流程控制
掌握了基础语法和数据类型后,我们需要学习如何控制程序的执行流程。Lua 提供了传统的条件语句和循环结构,但其语法与其他语言略有不同,更加简洁明了。
本章将详细讲解 if 条件判断、while 循环、for 循环(数值型和泛型)以及 repeat-until 循环。
3.1 条件语句
if 语句
if 语句用于根据条件执行代码块。
local age = 20
if age >= 18 then
print("成年人")
end
if-else 语句
如果条件为假,执行 else 块。
local age = 15
if age >= 18 then
print("成年人")
else
print("未成年人")
end
if-elseif-else 语句
处理多重条件。注意关键字是 elseif(中间没有空格)。
local score = 85
if score >= 90 then
print("优秀")
elseif score >= 80 then
print("良好")
elseif score >= ...
Lua 教程 - 第四章:函数深入
第四章:函数深入
函数是 Lua 程序的重要组成部分。在 Lua 中,函数是第一类值(First-Class Value),这意味着函数可以存储在变量中,可以作为参数传递给其他函数,也可以作为返回值。
本章将深入讲解函数的定义、参数传递、多返回值、可变参数以及闭包等高级特性。
4.1 函数基础
函数定义
使用 function 关键字定义函数。
-- 定义一个计算阶乘的函数
function factorial(n)
if n == 0 then
return 1
else
return n * factorial(n - 1)
end
end
print(factorial(5)) -- 120
这实际上是以下形式的语法糖:
factorial = function(n)
-- ...
end
函数调用
调用函数时,如果有参数,必须加上圆括号 ()。哪怕没有参数,也必须加上 ()。
特例:如果函数只有一个参数,且该参数是字符串字面量或表构造器,则可以省略括号。
print "Hello" -- 等同于 ...
Lua 教程 - 第五章:表的高级应用
第五章:表的高级应用
表(Table)不仅仅是数据容器,它还是 Lua 模块系统、面向对象编程和元编程的基石。在前面的章节中,我们学习了表的基础操作,本章将深入探讨表的更多高级特性。
我们将学习如何操作表、使用元表(Metatable)改变表的行为,以及如何利用表来实现面向对象编程(OOP)。
5.1 表操作
Lua 的 table 库提供了许多实用的函数来操作数组类型的表。
插入与删除
table.insert(list, [pos,] value): 在指定位置插入元素。默认插入末尾。
table.remove(list, [pos]): 删除指定位置的元素,并返回该元素。默认删除最后一个。
local t = {10, 20, 30}
table.insert(t, 40) -- {10, 20, 30, 40}
table.insert(t, 2, 15) -- {10, 15, 20, 30, 40}
print(table.remove(t, 1)) -- 10, t 变为 ...
Lua 教程 - 第六章:字符串进阶
第六章:字符串进阶
Lua 的字符串处理能力非常强大,尤其是它的模式匹配(Pattern Matching)机制。虽然它不像 Perl 或 Python 的正则表达式(Regex)那样功能全面,但 Lua 的模式匹配设计得更加轻量、高效,足以应对绝大多数日常需求。
本章将详细讲解 Lua 的模式匹配语法、常用的字符串函数以及如何进行高效的文本处理。
6.1 模式匹配基础
Lua 的模式匹配使用一些特殊字符来描述字符串的结构。
字符类 (Character Classes)
字符类用于匹配一组字符中的任意一个。
.: 任意字符
%a: 字母
%c: 控制字符
%d: 数字
%l: 小写字母
%p: 标点符号
%s: 空白字符
%u: 大写字母
%w: 字母和数字
%x: 十六进制数字
%z: 内部表示为 0 的字符
注意:大写形式表示补集。例如 %D 表示非数字,%S 表示非空白字符。
自定义字符类
使用 [] 可以自定义字符类。
[abc]: 匹配 a, b, 或 c
[0-9]: 匹配 0 到 9 的数字 (等同于 %d ...
Lua 教程 - 第七章:I/O 操作
第七章:I/O 操作
任何有用的程序都需要与外部世界交互。Lua 的 I/O 库提供了两种模型来处理文件输入输出:简单 I/O 模型和完整 I/O 模型。
简单模型:假设有一个当前输入文件和一个当前输出文件,所有的 I/O 操作都针对这两个文件。
完整模型:使用文件句柄(File Handles),类似于 C 语言中的 FILE*,可以同时操作多个文件。
7.1 简单 I/O 模型
简单模型非常适合处理标准输入(stdin)和标准输出(stdout),或者简单的文件读写任务。
io.input 和 io.output
io.input(filename): 设置默认输入文件。如果不带参数,返回当前输入文件句柄。
io.output(filename): 设置默认输出文件。
io.read
从默认输入文件中读取数据。参数决定了读取的方式:
"a": 读取整个文件。
"l": 读取下一行(丢弃换行符)。这是默认值。
"L": 读取下一行(保留换行符)。
n: 读取指定数量的字符。
...
Lua 教程 - 第八章:错误处理与调试
第八章:错误处理与调试
在编程过程中,错误是不可避免的。Lua 提供了几种处理错误和调试代码的机制,帮助我们编写更健壮的程序。
Lua 将错误主要分为两类:语法错误(Syntax Errors)和运行时错误(Runtime Errors)。本章主要讨论运行时错误的捕获与处理。
8.1 错误处理
error 函数
我们可以使用 error 函数显式地抛出一个错误,终止程序的执行。
print("Enter a number:")
local n = io.read("n")
if not n then
error("Invalid input! Not a number.")
end
assert 函数
assert(v [, message]) 检查第一个参数 v 是否为真(非 false 且非 nil)。如果是真,返回 v;如果是假,抛出一个错误,错误信息为 message(默认为 “assertion failed!”)。
local n = assert(io.read("n"), "invalid input")
相当于:
local n = io.read(" ...
Lua 教程 - 第九章:标准库
第九章:标准库
Lua 为了保持轻量级,核心语言非常小。但它提供了一组实用的标准库,涵盖了常用的功能。这些库由 C 语言实现,效率极高。
前面几章我们已经介绍了 string, table, io, debug 库。本章将重点介绍 math (数学) 和 os (操作系统) 库。
9.1 数学库 (math)
math 库包含了常用的数学函数。
常用三角函数
math.sin(x), math.cos(x), math.tan(x): 参数 x 为弧度。
math.deg(x): 弧度转角度。
math.rad(x): 角度转弧度。
print(math.sin(math.pi / 2)) -- 1.0
print(math.deg(math.pi)) -- 180.0
取整与绝对值
math.floor(x): 向下取整。
math.ceil(x): 向上取整。
math.abs(x): 绝对值。
math.fmod(x, y): 取模(浮点数)。
print(math.floor(3.7)) -- 3
print(math.cei ...
Lua 教程 - 第十章:Lua 与 C 交互
第十章:Lua 与 C 交互
Lua 的设计目标之一就是作为一种嵌入式语言,方便地与 C/C++ 等宿主语言进行交互。Lua 提供了丰富的 C API,允许我们在 C 代码中操作 Lua 状态机、调用 Lua 函数、读写 Lua 变量,反之亦然。
本章将介绍 Lua C API 的基础知识,包括栈操作、调用 Lua 函数以及在 C 中编写可供 Lua 调用的函数。
10.1 Lua C API 基础:虚拟栈
Lua 与 C 之间的数据交换是通过一个抽象的栈(Stack)来进行的。
Lua 将数据压入栈中,C 从栈中取出数据。
C 将数据压入栈中,Lua 从栈中取出数据。
栈索引
栈中的每个元素都有一个索引。
正索引:从栈底开始,1 表示栈底第一个元素,2 表示第二个,依此类推。
负索引:从栈顶开始,-1 表示栈顶元素,-2 表示栈顶下面的那个,依此类推。
常用栈操作 API
lua_pushnil(L): 压入 nil。
lua_pushboolean(L, b): 压入布尔值。
lua_pushnumber(L, n): 压入数字。
l ...

