【Lua】Lua 入门知识点总结
Lua 入门学习笔记
本教程旨在帮助有编程基础的学习者快速入门Lua编程语言。包括Lua中变量的声明与使用,包括全局变量和局部变量的区别,以及nil类型的概念、数值型、字符串和函数的基本操作,包括16进制表示、科学计数法、字符串连接、函数声明与调用等。此外,还介绍了table类型及其数字下标和字符串下标的用法,包括数组型table的声明、赋值、长度获取以及元素操作等。最后,介绍了Lua中的全局表、真和假的定义、分支判断语句以及三种循环语句(for循环、while循环)
建议有编程基础的同学使用这篇文章
一、编译环境
在线体验LuatOS
先直接写一个输出
print("hello world")
- 是
print不是printf - 语句后面没有分号
二、变量声明与作用域
-
默认全局变量:Lua 中直接赋值的变量默认是全局变量,跨文件可见。
-
局部变量:使用
local关键字声明,作用域限定在当前代码块、函数或文件内。 -
多变量赋值:
local a = 0 b, c = 1, 2 -- 同时声明 b=1, c=2 d, e, f = 1, 2 -- c 未被赋值,值为 nil- 规则:
- 左侧变量数 > 右侧值时,多余变量赋
nil; - 右侧值数 > 左侧变量时,多余值被忽略。
- 左侧变量数 > 右侧值时,多余变量赋
- 规则:
三、数据类型系统
nil 类型
-
表示未初始化或显式赋空值:没有初始化的都为nil
-
相当于C语言中的NULL类型
local a print(undeclared_var) -- 输出 nil
number 类型
在c语言里面数值有很多个类型,比如说int chair long float,但是在lua里面都统一叫做number数值型。
-
统一数值类型,支持多种表示方式:
- 十进制:
123 - 十六进制:
0x1F(十进制 31) - 科学计数法:
2e10(表示 20000000000)
- 十进制:
-
运算支持: lua也是支持加减乘除运算的,以及成幂符号,左移右移
print(10 ^ 5) -- 幂运算输出 100000 print(1 << 3) -- 左移运算输出 8 print(8 >> 1) -- 右移运算输出 4
string 类型
字符串的声明的话,跟c是差不多的。我们可以在lua里用双引号来圈住一些字,表示一个字符串也可以用单引号圈出一个字,表示字符串单引号和双引号都是可以的,而且支持转义字符。
-
声明方式:
-
单引号/双引号:支持转义符(如
\n) -
长字符串:
[[多行文本]](保留原始格式,不转义)a = "agcuiogogqWCU" b = 'uigdcfuwioge' c = [[dghoeuivfqwe qiowhc1266]]
-
-
操作:
另外在lua里面字符串的连接符号不是加号,是两个点
c = a..b -- 连接运算符是两个点 print(#"0123456789") -- 井号获取长度,输出 10 -
类型转换:
s = tostring(10) -- 转字符串 "10" n = tonumber("10") -- 转数值 10 tonumber("abc") -- 转换失败返回 nil -
显示字符串长度:
a = "agcuiogogqWCU" print(#a) --在打印的前面加上'#'就可以显示这个字符串的长度
四、函数定义与使用
函数声明
-
一般的声明方式:
function function_name(...)...-- body end -
两种等效方式:
function f(a, b) print(a, b) end f = function(a, b) print(a, b) end
参数与返回值
-
参数处理:
- 参数不足时自动补
nil,多余参数被忽略。
- 参数不足时自动补
-
多返回值: 我们可以在函数里主动返回一些值,并且可以返回多个值
function f() return 1, 2 end i, j = f() -- i=1, j=2 -
默认返回值:无
return时返回nil。
五、表(table)数据结构
数组型 table
-
语法:
-
用大括号将成员括起来 ‘{ }’
-
用赋值 ‘=’ 赋值给变量
-
用逗号将成员分开 ‘,’
arr = {1,2,3,4,5}
-
-
核心特性:
- 下标从 1 开始,支持混合类型元素(也就是说可以存数字、字符串、函数、其他的table,但要注意用 ‘,’ 隔开)。
- 未定义元素值为
nil。 - 动态扩展——对于table中没有定义的位置可以直接赋值
- 自带的接口
- insert(【table】,【位置】,【值】)
- remove(【table】,【位置】) ——有返回值,返回被移除的元素
-
操作示例:
arr = {1, "two", {subtable = true}} print(arr[5]) -- 输出 nil arr[5] = "new" -- 动态扩展 print(#arr) -- 获取长度 5 table.insert(arr, 2, "d") -- 插入元素 removed = table.remove(arr, 2) -- 移除元素并返回 "d"
哈希表型 table
-
字符串下标:
tbl = {key1 = 1,c = function()--.....end,["特殊符号"] = 123 --注意中括号以及"" } tbl["abc"] = "abc" print(tbl.key1) -- 输出 1(这种输出方式需要字符串下标符合变量命名规范) print(tbl["特殊符号"]) -- 输出 123(注意是字符串,带有"") -
未声明键值返回
nil,支持动态添加键值对。
全局表 _G
-
存储所有全局变量:
a = 1 print(_G["a"]) print(_G.a) -- 输出 1 print(_G.table.insert) -- 输出函数地址 -
实际上table也是一个全局变量,table这个全局变量它的类型就是table,它有一个下标叫做insert,同时table, 它因为是全局变量,所以它也在下划线g全局表里面,就像这样,我们打印出来发现它是一个table,而且呢,因为他也是一个table.
print(_G["table"]["insert"])
六、控制结构
逻辑运算
-
真假规则:仅
false和nil为假,其他值(包括 0)为真。a = true b = false print(1 > 2) print(1 < 2) print(1 <= 2) print(1 >= 2) print(1 == 2) print(1 ~= 2)注意:在lua中不等于是用 " ~=" 表示的,不是用 “!=” 表示的
短路求值:
print(nil or 0) -- 输出 0(返回第一个真值) print(true and "yes") -- 输出 "yes"(返回第二个操作数) -
and(与) or(或) 和 not(非)
a = true b = false print(a and b) print(a or b) print(not a)注意:
-
在lua里有个特殊的规定,在lua里面只有false和nil代表假,其他都是真c语言里面零也代表假,但是在lua里面数字0是代表真的,因为他不是nil或者false
-
Lua里面的end or和not返回的并不是完全是false和true, lua里会直接返回a或者b的值
-
我们可以用and和or来实现短路求值
a = nil b = 0 print(a and b) print(a or b) print(not a)运行结果:

-
分支判断
-
语法:
if 【condition】 then-- code elseif 【condition2】 then-- code else-- code end -
注意:
- elseif中间没有空格
- 条件后面有
then - 就像上面提到的0也是代表真
循环结构
-
for 循环:
for i = 1, 10 do -- 倒序循环if i == 5 then break end end注意:
-
循环定义了一个变量,然后给变量一个初值,再给变量定义一个结束值,下面是执行的代码块,这个变量是可以直接使用的。当然这个变量出了这个代码块之后,就没有意义了。
-
我们还可以再加一个参数,这个参数叫做步长,就是每一次循环初值
i的变化的值 -
循环里面
i在运行图中是不能手动更改的。如果你修改了,他会默认悄悄给你在这边新建一个变量,它新建了一个临时变量,叫做i,你后面调用的时候会用到i,这一点和c不太一样,它的循环是不能更改的。for i = 10, 1, -1 do -- 倒序循环if i == 5 then break end endfor i=10,i,-1 doprint(i)local i=1 -- 新建一个临时变量--.... end
-
-
while 循环:
n = 10 while n > 1 don = n - 1 -- 必须显式修改循环变量if n == 5 then break end end注意:lua不支持自减操作如
n--、n -= 1这些
七、字符串高级特性
-
二进制安全:支持存储空字符(
0x00):s = string.char(0x30, 0x31, 0x32, 0x33, 0x00) print(#s) -- 输出 5(包含空字符) -
索引从 1 开始:
second = string.sub(s, 2, 2) print(string.byte(second)) -- 输出 49(ASCII 码值)
八、类型转换与数值表示
| 操作 | 成功返回值 | 失败返回值 |
|---|---|---|
tonumber("123") | 123 | nil |
tonumber("0x1F") | 31 | nil |
tostring(123) | “123” | - |
tostring(nil) | “nil” | - |
九、编程实践要点
- 变量作用域:优先使用
local声明局部变量。 - 表操作:注意数组下标从 1 开始,
#仅统计连续数字下标长度。 - 字符串处理:使用
..连接,#获取字节长度。 - 函数设计:支持多返回值,参数不足自动补
nil。 - 全局变量管理:通过
_G表访问,避免污染全局命名空间。
进一步学习建议:
- 参考 Lua 5.3 官方手册
- 搜索 “Lua 5.3 参考手册” 查看完整函数库(如数学库、协程等)。
后面我会整理进阶部分的笔记,之后会把笔记链接粘贴到这里。
相关文章:
【Lua】Lua 入门知识点总结
Lua 入门学习笔记 本教程旨在帮助有编程基础的学习者快速入门Lua编程语言。包括Lua中变量的声明与使用,包括全局变量和局部变量的区别,以及nil类型的概念、数值型、字符串和函数的基本操作,包括16进制表示、科学计数法、字符串连接、函数声明…...
Godot学习-关于3D模型选择问题
下面是OBJ、glTF/GLB、BLEND和FBX四种3D模型格式的比较表格,以便更直观地了解它们之间的差异: 特性/格式OBJglTF / GLBBLENDFBX文件类型文本文本/二进制二进制二进制几何数据支持支持支持支持材质支持基础高级(PBR等)完整支持高级…...
光谱相机在肤质检测中的应用
光谱相机在肤质检测中具有独特优势,能够通过多波段光谱分析皮肤深层成分及生理状态,实现非侵入式、高精度、多维度的皮肤健康评估。以下是其核心应用与技术细节: 一、工作原理 光谱反射与吸收特性: 血红蛋白&a…...
IDEA 插件推荐清单(2025)
IDEA 插件推荐清单 精选高效开发必备插件,提升 Java 开发体验与效率。 参考来源:十六款好用的 IDEA 插件,强烈推荐!!!不容错过 代码开发助手类 插件名称功能简介推荐指数CodeGeeX智能代码补全、代码生成、…...
机器学习第一篇 线性回归
数据集:公开的World Happiness Report | Kaggle中的happiness dataset2017. 目标:基于GDP值预测幸福指数。(单特征预测) 代码: 文件一:prepare_for_traning.py """用于科学计算的一个库…...
CS144 Lab1实战记录:实现TCP重组器
文章目录 1 实验背景与要求1.1 TCP的数据分片与重组问题1.2 实验具体任务 2 重组器的设计架构2.1 整体架构2.2 数据结构设计 3 重组器处理的关键场景分析3.1 按序到达的子串(直接写入)3.2 乱序到达的子串(需要存储)3.3 与已处理区…...
Linux安装mysql_exporter
mysqld_exporter 是一个用于监控 MySQL 数据库的 Prometheus exporter。可以从 MySQL 数据库的 metrics_schema 收集指标,相关指标主要包括: MySQL 服务器指标:例如 uptime、version 等数据库指标:例如 schema_name、table_rows 等表指标:例如 table_name、engine、…...
BeautifulSoup 库的使用——python爬虫
文章目录 写在前面python 爬虫BeautifulSoup库是什么BeautifulSoup的安装解析器对比BeautifulSoup的使用BeautifulSoup 库中的4种类获取标签获取指定标签获取标签的的子标签获取标签的的父标签(上行遍历)获取标签的兄弟标签(平行遍历)获取注释根据条件查找标签根据CSS选择器查找…...
HTTP的Header
一、HTTP Header 是什么? HTTP Header 是 HTTP 协议中的头部信息部分,位于请求或响应的起始行之后,用来在客户端(浏览器等)与服务器之间传递元信息(meta-data)(简单理解为传递信息的…...
linux虚拟机网络问题处理
yum install -y yum-utils \ > device-mapper-persistent-data \ > lvm2 --skip-broken 已加载插件:fastestmirror, langpacks Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http://mirrorlist.centos.org/?release7&arch…...
unet算法发展历程简介
UNet是一种基于深度学习的图像分割架构,自2015年提出以来经历了多次改进和扩展,逐渐成为医学图像分割和其他精细分割任务的标杆。以下是UNet算法的主要发展历程和关键变体: 1. 原始UNet(2015) 论文: U-Net: Convoluti…...
基于华为云 ModelArts 的在线服务应用开发(Requests 模块)
基于华为云 ModelArts 的在线服务应用开发(Requests 模块) 一、本节目标 了解并掌握 Requests 模块的特点与用法学会通过 PythonRequests 访问华为云 ModelArts 在线推理服务熟悉 JSON 模块在 Python 中的数据序列化与反序列化掌握 Python 文件 I/O 的基…...
【Rust】基本概念
目录 第一个 Rust 程序:猜数字基本概念变量和可变性可变性常量变量隐藏 数据类型标量类型整型浮点型数值运算布尔型字符类型 复合类型元组数组 函数参数语句与表达式函数返回值 控制流使用 if 表达式控制条件if 表达式使用 else if 处理多重条件在 let 语句中使用 i…...
AI-Sphere-Butler之如何使用Llama factory LoRA微调Qwen2-1.5B/3B专属管家大模型
环境: AI-Sphere-Butler WSL2 英伟达4070ti 12G Win10 Ubuntu22.04 Qwen2.-1.5B/3B Llama factory llama.cpp 问题描述: AI-Sphere-Butler之如何使用Llama factory LoRA微调Qwen2-1.5B/3B管家大模型 解决方案: 一、准备数据集我这…...
C++学习之游戏服务器开发十四QT登录器实现
目录 1.界面搭建 2.登录客户端步骤分析 3.拼接登录请求实现 4.发送http请求 5.服务器登录请求处理 6.客户端处理服务器回复数据 7.注册页面启动 8.qt启动游戏程序 1.界面搭建 查询程序依赖的动态库 ldd 程序名 do 1 cdocker rm docker ps -aq 静态编译游戏服务程序&a…...
协同推荐算法实现的智能商品推荐系统 - [基于springboot +vue]
🛍️ 智能商品推荐系统 - 基于springboot vue 🚀 项目亮点 欢迎来到未来的购物体验!我们的智能商品推荐系统就像您的私人购物顾问,它能读懂您的心思,了解您的喜好,为您精心挑选最适合的商品。想象一下&am…...
【LLM】Ollama:容器化并加载本地 GGUF 模型
本教程将完整演示如何在支持多 GPU 的环境下,通过 Docker 实现 Ollama 的本地化部署,并深度整合本地 GGUF 模型。我们将构建一个具备生产可用性的容器化 LLM 服务,包含完整的存储映射、GPU 加速配置和模型管理方案。 前提与环境准备 操作系统…...
实践项目开发-hbmV4V20250407-Taro项目构建优化
Taro项目构建优化实践:大幅提升开发效率 项目背景 在开发基于ReactTaro的前端项目时,随着项目规模的增长,构建速度逐渐成为开发效率的瓶颈。通过一系列构建优化措施,成功将开发环境的构建速度提升了30%-50%,显著改善…...
MySQL中根据binlog日志进行恢复
MySQL中根据binlog日志进行恢复 排查 MySQL 的 binlog 日志问题及根据 binlog 日志进行恢复的方法一、引言二、排查 MySQL 的 binlog 日志问题(一)确认 binlog 是否开启(二)查找 binlog 文件位置和文件名模式(三&#…...
Jenkins的地位和作用
所处位置 Jenkins 是一款开源的自动化服务器,广泛应用于软件开发和测试流程中,主要用于实现持续集成(CI)和持续部署(CD)。它在开发和测试中的位置和作用可以从以下几个方面来理解: 1. 在开发和测…...
【集合】底层原理实现及各集合之间的区别
文章目录 集合2.1 介绍一下集合2.2 集合遍历的方法2.3 线程安全的集合2.4 数组和集合的区别2.5 ArrayList和LinkedList的区别2.6 ArrayList底层原理2.7 LinkedList底层原理2.8 CopyOnWriteArrayList底层原理2.9 HashSet底层原理2.10 HashMap底层原理2.11 HashTable底层原理2.12…...
软考高级-系统架构设计师 论文范文参考(二)
文章目录 论企业应用集成论软件三层结构的设计论软件设计模式的应用论软件维护及软件可维护性论信息系统安全性设计论信息系统的安全性设计(二)论信息系统的架构设计论信息系统架构设计(二) 论企业应用集成 摘要: 2016年9月,我国某省移动通信有限公司决定启动VerisB…...
srp batch
参考网址: Unity MaterialPropertyBlock 正确用法(解决无法合批等问题)_unity_define_instanced_prop的变量无法srp合批-CSDN博客 URP | 基础CG和HLSL区别 - 哔哩哔哩 (bilibili.com) 【直播回放】Unity 批处理/GPU Instancing/SRP Batche…...
【Linux运维涉及的基础命令与排查方法大全】
文章目录 前言1、计算机网络常用端口2、Kali Linux中常用的命令3、Kali Linux工具的介绍4、Ubuntu没有网络连接解决方法5、获取路由6、数据库端口 前言 以下介绍计算机常见的端口已经对应的网络协议,Linux中常用命令,以及平时运维中使用的排查网络故障的…...
【2025最新Java八股】redis中io多路复用怎么回事,和多线程的关系
io多路复用 IO 多路复用和多线程是两种不同的技术,他们都是用于改善程序在处理多个任务或多个数据流时的效率和性能的。 但是他俩要解决的问题不一样!IO多路复用主要是提升I/O操作的效率和利用率,所以适合 IO 密集型应用。多线程则是提升CP…...
Webview+Python:用HTML打造跨平台桌面应用的创新方案
目录 一、技术原理与优势分析 1.1 架构原理 1.2 核心优势 二、开发环境搭建 2.1 安装依赖 2.2 验证安装 三、核心功能开发 3.1 基础窗口管理 3.2 HTML↔Python通信 JavaScript调用Python Python调用JavaScript 四、高级功能实现 4.1 系统级集成 4.2 多窗口管理 五…...
Nginx HTTP 414 与“大面积”式洪水攻击联合防御实战
一、引言 在大规模分布式应用中,Nginx 常作为前端负载均衡和反向代理服务器。攻击者若结合超长 URI/头部攻击(触发 HTTP 414)与海量洪水攻击,可在网络层与应用层形成双重打击:一方面耗尽缓冲区和内存,另一…...
Oracle高级语法篇-集合操作
Oracle 集合操作详解 作为数据库领域的佼佼者,Oracle 提供了功能强大的集合操作符,它们能够合并多个查询的结果集,极大提升数据处理效率。接下来,本文将从基础知识点到实战案例,全方位剖析 Oracle 的集合操作。 一、…...
克服储能领域的数据处理瓶颈及AI拓展
对于储能研究人员来说,日常工作中经常围绕着一项核心但有时令人沮丧的任务:处理实验数据。从电池循环仪的嗡嗡声到包含电压和电流读数的大量电子表格,研究人员的大量时间都花在了提取有意义的见解上。长期以来,该领域一直受到对专…...
包含物体obj与相机camera的 代数几何代码解释
反余弦函数的值域在 [0, pi] 斜体样式 cam_pose self._cameras[hand_realsense].camera.get_model_matrix() # cam2world# 物体到相机的向量 obj_tcp_vec cam_pose[:3, 3] - self.obj_pose.p dist np.linalg.norm(obj_tcp_vec) # 物体位姿的旋转矩阵 obj_rot_mat self.ob…...
