Lua语言基础笔记

发布于:2025-09-12 ⋅ 阅读:(18) ⋅ 点赞:(0)

Lua 语言学习笔记

一、Lua 语言概述

Lua 是一种轻量级、高效的脚本语言,由巴西里约热内卢天主教大学(PUC-Rio)的 Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo 开发。它以 C 语言编写,具有跨平台性,广泛应用于游戏开发(如《魔兽世界》《英雄联盟》的插件系统)、嵌入式系统、Web 应用扩展等领域。其核心优势在于轻量级(标准库极小)可扩展性(可与 C/C++ 无缝集成)和动态类型(灵活便捷)

二、环境搭建

2.1 安装 Lua 解释器

  • Windows:从Lua 官方网站下载预编译的二进制包,解压后将lua.exe所在路径添加到系统环境变量。
  • 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 嵌入到游戏引擎或系统中。关键步骤包括:

  1. 在 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;

}

  1. 在 Lua 中调用 C 函数:通过lua_register注册 C 函数到 Lua 环境。

九、注意事项

  1. 变量作用域:全局变量可能污染命名空间,优先使用local声明局部变量。
  1. 数据类型转换:Lua 是动态类型语言,需注意隐式转换可能导致的逻辑错误(如字符串与数值相加会引发异常)。
  1. table索引:数组索引从 1 开始,字典索引需使用字符串或数值。
  1. 内存管理:Lua 使用自动垃圾回收,但频繁创建大型table或对象时仍需注意内存占用。
  1. 错误处理:使用pcall(保护模式调用)捕获运行时错误:

local success, result = pcall(function()

-- 可能出错的代码

error("发生错误")

end)

if not success then

print("错误:", result)

end

这份笔记涵盖了 Lua 语言的主要知识点和使用技巧。若你对某部分内容想进一步了解,或是想补充其他学习需求,欢迎随时告诉我。


网站公告

今日签到

点亮在社区的每一天
去签到