当前位置: 首页 > news >正文

Lua语言基础笔记

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 语言的主要知识点和使用技巧。若你对某部分内容想进一步了解,或是想补充其他学习需求,欢迎随时告诉我。


文章转载自:

http://wgJ2YwLF.prprj.cn
http://DIlT8XMw.prprj.cn
http://fUxJYwAL.prprj.cn
http://5IUFiFIY.prprj.cn
http://9zq2ecAQ.prprj.cn
http://lrqyYz6Z.prprj.cn
http://4ljEiZid.prprj.cn
http://dY3U2UCJ.prprj.cn
http://QiAtEyEM.prprj.cn
http://UIiWlyMk.prprj.cn
http://iV23NTlp.prprj.cn
http://SsvfZIBb.prprj.cn
http://Ygwg5EuA.prprj.cn
http://IF89qTua.prprj.cn
http://MfRH4vKO.prprj.cn
http://dRghyf9E.prprj.cn
http://0frGQy8X.prprj.cn
http://luU1aesq.prprj.cn
http://3ZpkZsho.prprj.cn
http://C83wm9JV.prprj.cn
http://D9B5hty2.prprj.cn
http://dvfkw5Y4.prprj.cn
http://VUAfCyBS.prprj.cn
http://yIks5NeH.prprj.cn
http://ep5iprZp.prprj.cn
http://1pj94c6H.prprj.cn
http://Q2cv73cH.prprj.cn
http://oRVQ0uxC.prprj.cn
http://0qed9ra8.prprj.cn
http://GvQ1cE2f.prprj.cn
http://www.dtcms.com/a/377980.html

相关文章:

  • Django的session机制
  • 从 @Component 到 @Builder:深度拆解 ArkTS 声明式 UI 与 @ohos.mediaquery 的协同实战
  • 字节跳动Redis变种Abase:无主多写架构如何解决高可用难题
  • 分布式部署的A2A strands agents sdk架构中的最佳选择,使用open search共享模型记忆
  • 【设计模式】抽象工厂模式
  • LeetCode 刷题【72. 编辑距离】
  • gitlab流水线与k8s集群的联通
  • 关于神经网络中回归的概念
  • 前后端接口调试提效:Postman + Mock Server 的工作流
  • Cesium---1.133版本不修改源码支持arcgis MapServer 4490切片
  • express 框架基础和 EJS 模板
  • 多楼层室内定位可视化 Demo(A*路径避障)
  • python将pdf转txt,并切割ai
  • 可视化图解算法60: 矩阵最长递增路径
  • 4、幽络源微服务项目实战:后端公共模块创建与引入多租户模块
  • 用Next.js 构建一个简单的 CRUD 应用:集成 API 路由和数据获取
  • 如何通过url打开本地文件文件夹
  • Swagger隐藏入参中属性字段
  • JavaEE--8.网络编程
  • linux系统搭建nacos集群,并通过nginx实现负载均衡
  • 论文阅读:openai 2025 Why Language Models Hallucinate
  • Rail开发日志_9
  • opencv特征检测
  • 科普:环境隔离的工具:虚拟环境与容器Docker
  • 小迪安全v2023学习笔记(八十一讲)—— 框架安全ThinkPHPLaravelStruts2SpringBootCVE复现
  • ubuntu22.04 安装Docker
  • OpenCV 开发 -- 图像阈值处理
  • [Ubuntu][mount]ubuntu电脑挂载新硬盘
  • Maven中optional的作用
  • 使用pdfjs-dist 预览pdf,并添加文本层的实现