【lua】Lua 入门教程:从环境搭建到基础编程

Lua 入门教程:从环境搭建到基础编程

Lua 是一种轻量级、可扩展的脚本语言,广泛应用于游戏开发(如《魔兽世界》《Roblox》)、嵌入式系统、Web 后端等领域。它语法简洁、运行高效,非常适合作为编程入门语言或辅助开发工具。本教程将带您从零开始,逐步掌握 Lua 的核心基础。

1️⃣ 环境搭建:让 Lua 跑起来

在开始编写 Lua 代码前,需先搭建运行环境,主要分为 “在线编辑器” 和 “本地安装” 两种方式,新手推荐优先使用在线编辑器快速体验语法。

在线编辑器(文本编辑器)

推荐使用下面任意网站:

  • https://www.mycompiler.io/new/lua

  • https://onecompiler.com/lua/

  • https://www.tutorialspoint.com/compilers/online-lua-compiler.htm

打开网页即可直接编写和运行代码,无需配置环境,适合快速测试小段代码。

在线编辑器(交互式/Terminal)

  • https://www.tutorialspoint.com/compilers/online-lua-terminal.htm

本地安装(Windows 系统为例)

  • 步骤 1:下载 Lua

访问 Lua 官方网站(www.lua.org),进入 “Download” 页面,然后找到LuaBinaries,下载适合 链接(如Lua 5.1.5 - Release 1)。
在这里插入图片描述

然后在打开的页面,选择Tools Executables目录
在这里插入图片描述

最后选择win64版本即可
在这里插入图片描述

  • 步骤 2:解压并配置环境变量

将压缩包解压到任意目录(如D:\lua),打开 “此电脑”→右键 “属性”→“高级系统设置”→“环境变量”,在 “系统变量” 的 “Path” 中添加D:\lua(解压目录路径)。

然后创建文件lua5.1.exe的快捷方式,然后重命名为lua.exe,方便后续调用。

  • 步骤 3:验证安装

按下Win+R,输入cmd打开命令提示符,输入lua -v,若显示如下内容,则安装成功。
在这里插入图片描述

编写第一个 Lua 程序

无论是在线编辑器还是本地环境,新建后缀为.lua的文件(如hello.lua),输入以下代码:

编写第一个 Lua 程序

无论是在线编辑器还是本地环境,新建一个后缀为.lua的文件(如hello.lua),输入以下代码:

-- 这是单行注释(双连字符开头)
print("Hello, Lua!")  -- 打印内容到控制台
  • 本地运行:打开命令提示符,进入文件所在目录,输入lua hello.lua,输出 “Hello, Lua!”。

  • 在线运行:点击编辑器 “Run” 按钮,直接查看结果。

2️⃣ 基础语法:变量与数据类型

Lua 是动态类型语言,无需提前声明变量类型,变量类型会根据赋值自动确定,核心包含 “变量声明赋值” 和 “常用数据类型” 两部分。

变量声明与赋值

Lua 变量分为 “全局变量” 和 “局部变量”:

  • 全局变量:直接赋值即可(默认全局),如name = "Lua"age = 29
  • 局部变量:用local关键字声明,仅在当前代码块(函数、循环)有效,推荐优先使用(避免全局变量污染),如local score = 95.5
  • 多变量赋值(Lua 特色语法):a, b, c = 10, "test", false,执行后a=10b="test"c=false,打印结果为10 test false
-- 全局变量
name = "Lua"
age = 29  -- Lua诞生于1993年-- 局部变量(推荐优先使用,避免全局变量污染)
local score = 95.5
local isUseful = true  -- 布尔值:true(真)或 false(假)-- 多变量赋值(Lua的特色语法)
a, b, c = 10, "test", false
print(a, b, c)  -- 输出:10    test    false

常用数据类型

Lua 共 8 种数据类型,新手重点掌握以下 5 种,具体说明如下表:

类型说明示例
nil空值,表示变量未定义或为空x = nil
boolean布尔值,仅truefalseisOk = true
number数值(整数 / 浮点数,不区分)num1 = 20num2 = 3.14
string字符串(单 / 双引号包裹)"Hello"'Lua'
table表(类似数组 / 字典,核心结构)arr = {1, 2, 3}
(1)字符串操作

字符串用..连接,用#获取长度,示例:

str1 = "Hello"
str2 = "Lua"
-- 字符串连接
fullStr = str1 .. " " .. str2  -- 结果:"Hello Lua"
-- 获取字符串长度
strLen = #fullStr  -- 结果:9("Hello Lua"共9个字符)
print(fullStr, strLen)  -- 输出:Hello Lua    9
(2)表(table)基础

表是 Lua 最灵活的数据结构,可当数组或字典使用:

  • 数组(索引从 1 开始):arr = {10, 20, 30}arr[1]=10arr[2]=20,打印arr[1]输出10
  • 字典(键值对):person = {name = "Tom", age = 18},通过person.nameperson["name"]获取值,打印person.name输出Tom
  • 混合使用:mixTable = {"apple", "banana", price = 5.8}mixTable[2]="banana"mixTable.price=5.8,打印结果为banana 5.8
-- 1. 数组(索引从1开始,这是Lua与其他语言的区别)
arr = {10, 20, 30}  -- 索引1→10,索引2→20,索引3→30
print(arr[1])  -- 输出:10(注意:不是arr[0])-- 2. 字典(键值对形式)
person = {name = "Tom",age = 18,score = 92
}
print(person.name)  -- 输出:Tom(等价于person["name"])-- 3. 混合使用
mixTable = {"apple", "banana",  -- 数组部分:索引1→apple,索引2→bananaprice = 5.8,        -- 字典部分:键price→5.8count = 10
}
print(mixTable[2], mixTable.price)  -- 输出:banana    5.8

3️⃣ 流程控制:条件与循环

流程控制用于控制代码执行顺序,核心包含 “条件判断(if-else)” 和 “循环(for、while)”,是实现逻辑分支与重复执行的关键。

条件判断(if-else)

语法格式:

if 条件1 then-- 条件1为true时执行
elseif 条件2 then-- 条件1为false,条件2为true时执行
else-- 所有条件都为false时执行
end

示例(根据分数判断等级):

local score = 85
if score >= 90 thenprint("优秀")
elseif score >= 80 thenprint("良好")
elseif score >= 60 thenprint("及格")
elseprint("不及格")
end
-- 输出:良好

循环(for、while)

(1)for 循环(最常用)

分为 “数值 for 循环” 和 “泛型 for 循环”:

  • 数值 for 循环:for 变量=起始值,结束值,步长 do ... end(步长默认 1,可省略),示例 1(打印 1-5):
for i = 1, 5 doprint(i)  -- 输出:1 2 3 4 5
end

示例 2(打印 10-2,步长 - 2):

for j = 10, 2, -2 doprint(j)  -- 输出:10 8 6 4 2
end
  • 泛型 for 循环:用于遍历表 / 字符串,需配合ipairs(遍历数组),示例(遍历数组):
arr = {"a", "b", "c"}
for index, value in ipairs(arr) doprint("索引:" .. index .. ",值:" .. value)
end

输出:

索引:1,值:a

索引:2,值:b

索引:3,值:c

(2)while 循环

语法格式:while 条件 do ... end(条件为 true 时持续执行),示例(计算 1-10 的和):

local sum = 0
local i = 1while i <= 10 dosum = sum + i  -- 累加求和i = i + 1  -- 更新循环变量,避免无限循环
end
print("1到10的和:" .. sum)  -- 输出:1到10的和:55

4️⃣ 函数:代码的复用与封装

函数是可重复调用的代码块,用于封装逻辑、提高复用性,Lua 中函数支持 “多返回值” 和 “匿名函数”,是代码模块化的核心。

函数定义与调用

语法格式:

function 函数名(参数1, 参数2, ...)-- 函数体return 返回值1, 返回值2, ...  -- 可选,支持多返回值
end

示例 1(计算两数之和):

function add(a, b)local result = a + breturn result
endlocal total = add(5, 3)
print("5+3=" .. total)  -- 输出:5+3=8

示例 2(返回多值:和与差):

function calculate(a, b)local sum = a + blocal diff = a - breturn sum, diff  -- 返回两个值
ends, d = calculate(10, 4)
print("和:" .. s .. ",差:" .. d)  -- 输出:和:14,差:6

匿名函数(进阶)

匿名函数无函数名,通常作为参数传递给其他函数(如表遍历、事件回调),示例(用匿名函数遍历表):

arr = {1, 2, 3, 4}
-- table.foreach遍历表,第二个参数为匿名函数
table.foreach(arr, function(index, value)print("索引" .. index .. ":" .. value \* 2)  -- 值乘以2后输出
end)

输出:

索引1:2

索引2:4

索引3:6

索引4:8

5️⃣ 实战小案例:简易计算器

结合前面所学语法,实现支持 “加、减、乘、除” 的计算器,包含异常处理(除数为 0、不支持的运算符),巩固核心知识点。

计算器代码实现

-- 定义计算器函数
function calculator(num1, num2, op)local resultif op == "+" thenresult = num1 + num2elseif op == "-" thenresult = num1 - num2elseif op == "*" thenresult = num1 * num2elseif op == "/" then-- 处理除数为0的情况if num2 == 0 thenreturn "错误:除数不能为0"endresult = num1 / num2elsereturn "错误:不支持的运算符(仅支持+、-、*、/)"endreturn "计算结果:" .. num1 .. op .. num2 .. "=" .. result
end-- 测试计算器
print(calculator(10, 5, "+"))  -- 输出:计算结果:10+5=15
print(calculator(20, 3, "-"))  -- 输出:计算结果:20-3=17
print(calculator(6, 7, "*"))   -- 输出:计算结果:6*7=42
print(calculator(10, 0, "/"))  -- 输出:错误:除数不能为0
print(calculator(8, 2, "^"))   -- 输出:错误:不支持的运算符(仅支持+、-、*、/)

6️⃣ 学习资源推荐

  • 官方文档:Lua 5.1 参考手册(最权威的资料,建议常备);

  • 书籍:《Lua 程序设计(第 4 版)》(Lua 创始人编写,适合深入学习);

  • 在线课程:Bilibili 搜索 “Lua 入门”,有大量免费视频教程,适合视觉学习者。

  • Lua Demo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95308.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95308.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL索引事务(未完成)

索引的相关操作1.查看索引show index from 表名;2.创建索引create index 索引名字 on 表名(列名);创建索引&#xff0c;是一个危险操作创建索引的时候&#xff0c;需要针对现有的数据&#xff0c;进行大规模的重新整理如果当前表是一个空表&#xff0c;或者数据不多&#xff0c…

Docker一键快速部署压测工具,高效测试 API 接口性能

以下是对该压测工具的简单介绍&#xff1a; 这是一个简易的在线压测工具&#xff0c;可以对 API 接口/页面、websocket服务等进行压力测试&#xff0c;检验服务的并发能力使用 thinkphp ant design pro 构建&#xff0c;压测能力驱动基于 wrk 、 php 多进程协程实现支持在线授…

前端缓存问题详解

前端缓存是提升网页性能和用户体验的重要手段&#xff0c;但也常导致资源更新不及时等问题。以下是关于前端缓存的核心知识点和解决方案&#xff1a; 一、缓存类型及工作原理HTTP缓存&#xff08;最核心&#xff09; 强缓存&#xff1a;直接从本地读取&#xff0c;不请求服务器…

webpack升级

一、调研对比维度Webpack 4 状态Webpack 5 改进与优势构建速度较慢&#xff0c;增量构建效率低✅ 引入 持久化缓存&#xff08;filesystem cache&#xff09;&#xff0c;二次构建速度提升高达 90%Tree Shaking支持基础 Tree Shaking&#xff0c;需手动配置✅ 更强的 Tree Shak…

Logstash数据迁移之es-to-kafka.conf详细配置

在 Logstash 中配置从 Elasticsearch (ES) 读取数据并输出到 Kafka 是一个相对高级但强大的用法&#xff0c;通常用于数据迁移、重新索引、或构建新的数据管道。 下面我将详细解释配置文件的各个部分和细节。 核心配置文件结构 (es-to-kafka.conf) 一个完整的配置文件主要包含三…

在OracleLinux9.4系统上静默滚动打补丁安装Oracle19c

OracleLinux9.4系统 安装Oracle19c 文章目录OracleLinux9.4系统 安装Oracle19c一、安装准备1、yum安装预检查需要的包2、系统资源二、滚动安装一、安装准备 1、yum安装预检查需要的包 yum install libnsl yum install -y oracle-database-preinstall-19c # 最新的unzip yum i…

Android原生HttpURLConnection上传图片方案

创建上传方法object FormUploader {private val BOUNDARY "Boundary-" System.currentTimeMillis()private const val LINE_FEED "\r\n"Throws(IOException::class)fun uploadImage(url: String, imageFile: File, params: MutableMap<String?, Str…

落叶清扫机器人cad+三维图+设计说明书

摘 要 城市公共场所、校园等环境中&#xff0c;落叶的清扫一直是一个繁琐而耗时的任务。传统的人工清扫方式不仅效率低下&#xff0c;还存在人力浪费和安全隐患等问题。因此&#xff0c;研发一款能够自主完成落叶清扫任务的机器人成为了当今研究的热点之一。随着科技的不断进…

国别域名的SEO优势:是否更利于在当地搜索引擎排名?

当你盯着搜索引擎结果页发呆时&#xff0c;有没有想过——凭什么那个.jp域名的网站能排在.ca前面&#xff1f;别扯什么内容质量&#xff0c;上周帮客户优化新加坡市场时&#xff0c;亲眼见着两个内容相似度90%的页面&#xff0c;.sg域名比.com.au在Google Singapore上高出3个排…

动态配置最佳实践:Spring Boot 十种落地方式与回滚审计指南(含实操与避坑)

作为一名Spring Boot开发者&#xff0c;正在运维一个高可用微服务系统&#xff1a;业务需求变化频繁&#xff0c;需要实时调整配置如数据库连接或日志级别&#xff0c;但每次修改都得重启应用&#xff0c;造成服务中断和用户投诉。这不是小麻烦&#xff0c;而是配置管理的痛点—…

vue社区网格化管理系统(代码+数据库+LW)

摘要 随着城市化进程的加快&#xff0c;社区管理的复杂性逐渐增大&#xff0c;传统的管理模式已无法满足现代社区管理的需求。社区网格化管理系统作为一种新的管理模式&#xff0c;通过将社区划分为多个网格单元&#xff0c;使得管理更加精细化、智能化和高效化。本论文基于Sp…

使用EasyExcel实现Excel单元格保护:自由锁定表头和数据行

使用EasyExcel实现Excel单元格保护&#xff1a;锁定表头和第二行数据 前言 在日常开发中&#xff0c;我们经常需要导出Excel文件&#xff0c;有时还需要对Excel中的某些单元格进行保护&#xff0c;防止用户误修改。本文将介绍如何使用EasyExcel 4.0.3实现锁定Excel表头和第二行…

dify docker知识库topk最大值参数配置

1 问题说明 dify构建RAG知识库过程中&#xff0c;通过会遇到一些默认配置不能解决的问题。 比如topk&#xff0c;topk默认最大10&#xff0c;对语义模糊的检索&#xff0c;目标文档可能没进前10&#xff0c;出现在10-30区间。 所以&#xff0c;需要调整topk最大值参数。 # T…

SRE命令行兵器谱之一:精通top/htop - 从性能“体检”到瓶颈“解剖”

SRE命令行兵器谱之一:精通top/htop - 从性能“体检”到瓶颈“解剖” SRE的“战场”:真实故障场景 下午三点,监控系统告警:“核心API服务响应时间(P99)飙升至5秒”。用户已经开始在群里抱怨接口超时。这是一个典型的线上性能问题,每一秒的延迟都在影响用户体验和公司收…

一、Git与Gitee常见问题解答

Git与Gitee常见问题解答 Git相关问题 Q1: 什么是Git&#xff1f; A: Git是一个分布式版本控制系统&#xff0c;由Linux之父Linus Torvalds开发。它能够跟踪文件的变更历史&#xff0c;支持多人协作开发&#xff0c;是现代软件开发中不可或缺的工具。 Q2: Git的三个区域是什么&a…

kubernetes服务质量之QoS类

一、QoS类 Kubernetes的QoS&#xff08;Quality of Service&#xff09;类别允许您指定可用于应用程序的可用资源数量&#xff0c;以便更好地控制应用程序的可用性。它还允许您限制特定应用程序的资源使用率&#xff0c;以帮助保护系统的稳定性和性能。 Kubernetes 创建 Pod 时…

Redis--Lua脚本以及在SpringBoot中的使用

前言、为什么要用 Lua&#xff1f;多步操作合并为一步&#xff0c;保证原子性。减少网络通信次数。下推逻辑到 Redis&#xff0c;提高性能。一、Redis 使用 Lua 脚本的两种方式方式一&#xff1a;使用 --eval 执行脚本文件这种方式 需要先写一个 Lua 文件。&#x1f4cc; 示例&…

基于 C 语言的网络单词查询系统设计与实现(客户端 + 服务器端)

一、项目概述本文将介绍一个基于 C 语言开发的网络单词查询系统&#xff0c;该系统包含客户端和服务器端两部分&#xff0c;支持用户注册、登录、单词查询及历史记录查询等功能。系统采用 TCP socket 实现网络通信&#xff0c;使用 SQLite 数据库存储用户信息、单词数据及查询记…

《JAVA EE企业级应用开发》第一课笔记

《JAVA EE企业级应用开发》第一课笔记 文章目录《JAVA EE企业级应用开发》第一课笔记课程主题&#xff1a;三层架构与SSM框架概述一、核心架构&#xff1a;三层架构 (MVC)1. 表现层 (Presentation Layer)2. 业务逻辑层 (Business Logic Layer)3. 数据持久层 (Data Persistence …

RT-DETR网络结构

1.前言 本章主要来介绍下RT-DETR的网络结构,参考的依旧是ultralytics实现的RT-DETR-L,代码如下: ultralytics/ultralytics: Ultralytics YOLO 🚀 首先谈谈我对RT-DETR的浅显认识,他不像是YOLOv8这种纯CNN实现的网络,也不像是Vit这种以Transformer实现的网络,他是前一…