Lua 语言学习笔记
一、Lua 语言概述
Lua 是一种轻量级、高效的脚本语言,由巴西里约热内卢天主教大学(PUC-Rio)的 Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo 开发。它以 C 语言编写,具有跨平台性,广泛应用于游戏开发(如《魔兽世界》《英雄联盟》的插件系统)、嵌入式系统、Web 应用扩展等领域。其核心优势在于轻量级(标准库极小)、可扩展性(可与 C/C++ 无缝集成)和动态类型(灵活便捷) 。
二、环境搭建
2.1 安装 Lua 解释器
- Linux:使用包管理器安装,如apt-get install lua5.4(Debian/Ubuntu)或yum install lua(CentOS)。
- MacOS:通过 Homebrew 安装,执行brew install lua。
2.2 编辑器选择
推荐使用 Visual Studio Code(搭配 Lua 插件)、Sublime Text 或 Atom,支持语法高亮、代码补全和调试功能。
三、基础语法
3.1 数据类型
Lua 有 8 种基本数据类型:nil、boolean、number、string、table、function、userdata和thread。
- nil:表示空值或未初始化的变量,如:
local x
print(x) -- 输出:nil
- boolean:只有true和false两个值,逻辑运算时非nil和非false的值都被视为true。
- number:Lua 使用双精度浮点数表示所有数值,支持数学运算:
local a = 10
local b = 3
print(a + b) -- 输出:13
print(a / b) -- 输出:3.3333333333333
- string:使用单引号或双引号定义,支持字符串拼接(..)和长度获取(#):
local str1 = "Hello"
local str2 = "World"
print(str1 .. " " .. str2) -- 输出:Hello World
print(#str1) -- 输出:5
- table:Lua 中最强大的数据结构,可作为数组、字典或对象使用,索引从 1 开始:
local arr = {10, 20, 30}
print(arr[1]) -- 输出:10
local dict = {name = "Alice", age = 25}
print(dict.name) -- 输出:Alice
- function:一等公民,可以赋值给变量、作为参数传递或返回值:
local add = function(a, b)
return a + b
end
print(add(5, 3)) -- 输出:8
3.2 变量声明
使用local关键字声明局部变量,未声明local的变量为全局变量(不推荐滥用,易导致命名冲突):
local x = 10 -- 局部变量
y = 20 -- 全局变量
四、控制结构
4.1 if-else语句
local age = 18
if age >= 18 then
print("成年人")
else
print("未成年人")
end
4.2 for循环
- 数值型for:指定起始和结束值,步长默认为 1:
for i = 1, 5 do
print(i)
end
- 泛型for:用于遍历table等数据结构:
local fruits = {"apple", "banana", "cherry"}
for index, fruit in ipairs(fruits) do
print(index, fruit)
end
4.3 while循环
local i = 1
while i <= 5 do
print(i)
i = i + 1
end
五、函数
5.1 函数定义与调用
function add(a, b)
return a + b
end
local result = add(10, 20)
print(result) -- 输出:30
5.2 可变参数函数
function sum(...)
local total = 0
for _, num in ipairs({...}) do
total = total + num
end
return total
end
print(sum(1, 2, 3, 4)) -- 输出:10
5.3 匿名函数
常用于回调或高阶函数场景:
local numbers = {5, 3, 8, 1}
table.sort(numbers, function(a, b) return a < b end)
print(table.concat(numbers, ",")) -- 输出:1,3,5,8
六、Table 高级用法
6.1 作为数组
local array = {}
table.insert(array, "value1")
table.insert(array, "value2")
local element = table.remove(array) -- 移除并返回最后一个元素
6.2 作为字典
local person = {name = "Bob", age = 30}
person["city"] = "New York" -- 添加新字段
for key, value in pairs(person) do
print(key, value)
end
6.3 元表(Metatable)
用于自定义table的行为,如运算符重载:
local mt = {
__add = function(a, b)
local result = {}
for i = 1, math.max(#a, #b) do
result[i] = (a[i] or 0) + (b[i] or 0)
end
return result
end
}
local a = {1, 2, 3}
local b = {4, 5}
setmetatable(a, mt)
local c = a + b
print(table.concat(c, ",")) -- 输出:5,7,3
七、面向对象编程
Lua 通过table和元表模拟类和对象:
-- 定义类
local Person = {}
Person.__index = Person
function Person:new(name, age)
local self = setmetatable({}, Person)
self.name = name
self.age = age
return self
end
function Person:sayHello()
print("Hello, my name is " .. self.name)
end
-- 创建对象
local alice = Person:new("Alice", 25)
alice:sayHello() -- 输出:Hello, my name is Alice
八、与 C/C++ 交互
Lua 通过Lua C API实现与 C/C++ 的双向调用,常用于将 Lua 嵌入到游戏引擎或系统中。关键步骤包括:
- 在 C/C++ 中初始化 Lua 状态机:
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
int main() {
lua_State* L = luaL_newstate(); // 创建Lua状态机
luaL_openlibs(L); // 加载标准库
// 执行Lua脚本或调用Lua函数
lua_close(L); // 释放资源
return 0;
}
- 在 Lua 中调用 C 函数:通过lua_register注册 C 函数到 Lua 环境。
九、注意事项
- 变量作用域:全局变量可能污染命名空间,优先使用local声明局部变量。
- 数据类型转换:Lua 是动态类型语言,需注意隐式转换可能导致的逻辑错误(如字符串与数值相加会引发异常)。
- table索引:数组索引从 1 开始,字典索引需使用字符串或数值。
- 内存管理:Lua 使用自动垃圾回收,但频繁创建大型table或对象时仍需注意内存占用。
- 错误处理:使用pcall(保护模式调用)捕获运行时错误:
local success, result = pcall(function()
-- 可能出错的代码
error("发生错误")
end)
if not success then
print("错误:", result)
end
这份笔记涵盖了 Lua 语言的主要知识点和使用技巧。若你对某部分内容想进一步了解,或是想补充其他学习需求,欢迎随时告诉我。