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

Lua基础语法

文章目录

  • 一、注释
  • 二、 数据类型
    • 1. 注意事项
    • 2. 全局/局部变量
  • 三、 标识符
    • 1. 保留字
    • 2. 变量
    • 3. 动态类型
  • 四、 运算符
    • 1. 算术运算符
    • 2. 关系运算符
    • 3. 逻辑运算符
    • 4. 其他运算符
  • 五、 函数
    • 1. 固定参函数
    • 2. 可变参函数
    • 3. 可返回多个值
    • 4. 函数作为参数
  • 六、循环控制语句
    • 1. while...do
    • 2. repeat...until
    • 3. 数值 for
    • 4. 泛型 for
  • 七、 流程控制语句
    • 1. if 语句
    • 2. if 嵌套语句


一、注释

Lua 的行注释为两个连续的减号,段注释以- -[[开头,以- -]]结尾。
不过,在调试过程中如果想临时取消段注释,而直接将其标识删除,这样做其实并不好。因为有可能还需要再添加上。而段注释的写法相对较麻烦。所以,Lua 给出了一种简单处理方式:在开头的–[[前再加一个减号,即可使段注释不起作用。其实就是使两个段注释标识变为了两个行注释。

--[[
这个是段注释
--]]--这个是行注释

在这里插入图片描述
想要取消段注释--[[前面多加一个-就好了。
可见被红波浪线警告了,即注释失效了
在这里插入图片描述

二、 数据类型

Lua 中有 8 种类型,分别为:nil、boolean、number、string、userdata、function、thread 和 table。通过 type()函数可以查看一个数据的类型,例如,type(nil)的结果为 nil,type(123)的结果为 number。

在这里插入图片描述

print(type(123))
print(type("hello"))
print(type(1.12))
print(type(nil))

在这里插入图片描述

1. 注意事项

值得注意的是lua是弱类型的,也就是说一个变量的类型是可以改变的,比如这个变量n,一开始是int类型的,后来又变成了string类型的,而且lua中变量不需要声明类型,直接赋值就好了。

string类型复制的时候单引号和双引号都是可以的

n=10
print(type(n))
n="hello world"
print(type(n))
n='hello'
print(type(n))

在这里插入图片描述

2. 全局/局部变量

在lua中不管是在全局还是函数内不加local声明的变量全是全局变量,只有在函数内用local声明的变量才是局部变量,局部变量只能在本函数内使用。

Str1="全局"function F()local str="local修饰的局部变量"Str2="函数内部的全局变量"print(Str1)
end
F()
print(Str2)

可以看出Str1和Str2都是全局变量,在任何位置都可以被访问
在这里插入图片描述
当我们在外面访问局部变量的时候就会报错,如图:
在这里插入图片描述

三、 标识符

程序设计语言中的标识符主要包含保留字、变量、常量、方法名、函数名、类名等。Lua的标识符由字母、数字与下划线组成,但不能以数字开头。Lua 是大小写敏感的。

1. 保留字

Lua 常见的保留字共有 22 个。不过,除了这 22 个外,Lua 中还定义了很多的内置全局变量,这些内置全局变量的一个共同特征是,以下划线开头后跟全大写字母。所以我们在定义自己的标识符时不能与这些保留字、内置全局变量重复。

这些关键字基本和C/C++里的没啥区别,不多介绍,以后用到的话再详细说明。
在这里插入图片描述

2. 变量

Lua 是弱类型语言,变量无需类型声明即可直接使用。变量分为全局变量与局部变量。Lua 中的变量默认都是全局变量,即使声明在语句块或函数里。全局变量一旦声明,在当前文件中的任何地方都可访问。局部变量 local 相当于 Java 中的 private 变量,只能在声明的语句块中使用。

3. 动态类型

Lua 是动态类型语言,变量的类型可以随时改变,无需声明。

四、 运算符

1. 算术运算符

以a为10,b为20为例

local a=10
local b=20
print(a+b)
print(a-b)
print(a*b)
print(a/b)
print(a%b)
print(a^2)
print(-a)
print(5//2)--类似python里的地板除

在这里插入图片描述

  • SciTE 对 Lua 支持的目前最高版本为 5.1,而整除运算符//需要在 Lua5.3 版本以上,所以当前 SciTE 中无法看到效果。
  • 在命令行模式中,直接输入变量名回车,即相当于 print()函数输出该变量。

2. 关系运算符

下表列出了 Lua 语言中的常用关系运算符,设定 A 的值为 10,B 的值为 20:
和C/C++几乎一样,除了不等于,C/C++里是!=,lua里是~=。其余的一摸一样,就不演示了。
在这里插入图片描述

3. 逻辑运算符

注意,Lua 系统将 false 与 nil 作为假,将 true 与非 nil 作为真,即使是 0 也是真。下表列出了 Lua 语言中的常用逻辑运算符,设定 A 的值为 true,B 的值为 false:
在这里插入图片描述

A=true
B=false
print(A and B)
print(A or B)
print(not A)

在这里插入图片描述

4. 其他运算符

下表列出了 Lua 语言中的连接运算符与计算表或字符串长度的运算符
在这里插入图片描述

A="hello"
B=" world"
print(A..B)
print(#A)

在这里插入图片描述

五、 函数

Lua 中函数的定义是以 function 开头,后跟函数名与参数列表,以 end 结尾。其可以没有返回值,也可以一次返回多个值。

1. 固定参函数

Lua 中的函数在调用时与 Java 语言中方法的调用是不同的,其不要求实参的个数必须与函数中形参的个数相同。如果实参个数少于形参个数,则系统自动使用 nil 填充;如果实参个数多于形参个数,多出的将被系统自动忽略。

function F(a,b)print(a,b)
end
print("无实参传递")
F()
print("传递一个实参")
F(1)
print("传递两个实参")
F(1,2)
print("传递三个实参")
F(1,2,3)
print("传递四个实参")
F(1,2,3,4)

如图所示,实参和形参个数可以不一样,实参少,则形参自动用nil替代,实参多则直接忽略。
在这里插入图片描述

2. 可变参函数

在函数定义时不给出具体形参的个数,而是使用三个连续的点号。在函数调用时就可以向该函数传递任意个数的参数,函数可以全部接收。

function F(...)local a,b,c,d=...print(a, b, c, d)print(...)
endprint("传递三个实参")
F(10, 20, 30)print("传递四个实参")
F(10, 20, 30, 40)print("传递五个实参")
F(10, 20, 30, 40, 50)

local a,b,c,d=…也是少了的用nil代替,多了的直接忽略
在这里插入图片描述

3. 可返回多个值

Lua 中的函数一次可以返回多个值,但需要有多个变量来同时接收。

-- 定义一个普通函数,返回两个值
function F(a, b)local sum = a + blocal mul = a * breturn sum, mul;
end-- 一次性接收两个值
M, N = F(3, 5)
print(M, N)X=F(2,6)
print(X)M,N,X=F(3,3)
print(M,N,X)

在这里插入图片描述
在这里插入图片描述

4. 函数作为参数

Lua 的函数中,允许函数作为参数。而作为参数的函数,可以是已经定义好的普通函数,也可以是匿名函数。

function Add(a,b)return a+b
endfunction Mul(a,b)return a*b
endfunction F(a,b,f)print(f(a,b))
endF(2,4,Add)
F(2,4,Mul)
-- 匿名函数调用
F(2, 4, function (a, b)return a - b;end
);

类似于C语言里的传递函数指针,C++里的传递可调用对象。
在这里插入图片描述

六、循环控制语句

Lua 提供了四种循环控制语句:while…do 循环、repeat…until 循环、数值 for 循环,及泛型 for 循环。同时,Lua 还提供了 break 与 goto 两种循环流程控制语句。

1. while…do

只要 while 中的条件成立就一直循环。

a = 3
while a>0 doprint(a)a = a - 1
end

说白了就是C语言里的while循环
在这里插入图片描述

2. repeat…until

until 中的条件成立了,循环就要停止。

a=3
repeatprint(a)a = a - 1
until a <= 0

说白了就是C语言里的do while
在这里插入图片描述

3. 数值 for

这种 for 循环只参用于循环变量为数值型的情况。其语法格式为:

for var=exp1, exp2, exp3 do循环体
end
可以类比为C语言里的
for(int i=exp1;i<=exp2;i+=exp3){}

var 为指定的循环变量,exp1 为循环起始值,exp2 为循环结束值,exp3 为循环步长。
步长可省略不写,默认为 1。每循环一次,系统内部都会做一次当前循环变量 var 的值与 exp2的比较,如果 var 小于等于 exp2 的值,则继续循环,否则结束循环。


for i=1, 9 doprint(i)if i == 5 thenbreakend
end

在这里插入图片描述

4. 泛型 for

泛型 for 用于遍历 table 中的所有值,其需要与 Lua 的迭代器联合使用。后面 table 再详解。

七、 流程控制语句

1. if 语句

Lua 提供了 if…then 用于表示条件判断,其中 if 的判断条件可以是任意表达式。Lua 系统将 false 与 nil 作为假,将 true 与非 nil 作为真,即使是 0 也是真。需要注意,Lua 中的 if 语句的判断条件可以使用小括号括起来,也可以不使用。

A=10
if A==10 thenprint("A=10")
end

在这里插入图片描述

2. if 嵌套语句

Lua 中提供了专门的关键字 elseif 来做 if 嵌套语句。注意,不能使用 else 与 if 两个关键字的联用形式,即不能使用 else if 来嵌套 if 语句。就是elseif要合起来中间不能有空格

A=11
if A<10 thenprint("A<10")
elseif A>10 thenprint("A>10")
elseprint("A=10")
end

在这里插入图片描述

相关文章:

Lua基础语法

文章目录 一、注释二、 数据类型1. 注意事项2. 全局/局部变量 三、 标识符1. 保留字2. 变量3. 动态类型 四、 运算符1. 算术运算符2. 关系运算符3. 逻辑运算符4. 其他运算符 五、 函数1. 固定参函数2. 可变参函数3. 可返回多个值4. 函数作为参数 六、循环控制语句1. while...do…...

2025年渗透测试面试题总结-匿名[实习]安全工程师(安全厂商)(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 一面技术问题 1. Burp插件原理 2. JavaWeb项目经验 3. CC1-7链原理&#xff08;以CC6为例&#xff0…...

【node.js】实战项目

个人主页&#xff1a;Guiat 归属专栏&#xff1a;node.js 文章目录 1. 项目概览与架构设计1.1 实战项目&#xff1a;企业级电商管理系统1.2 技术栈选择 2. 项目初始化与基础架构2.1 项目结构设计2.2 基础配置管理 3. 用户服务实现3.1 用户服务架构3.2 用户模型设计3.3 用户服务…...

从AD9361 到 ADSY1100 ,中间的迭代产品历史

从 AD9361 到 ADSY1100 的演进&#xff0c;是 Analog Devices&#xff08;ADI&#xff09;在射频收发器&#xff08;RF Transceiver&#xff09;集成化、高性能、宽带宽、低功耗和波束赋形能力方面持续推进的一个路线。以下是其中的重要芯片节点和核心参数对比&#xff1a; 1. …...

免费插件集-illustrator插件-Ai插件-查找选中颜色与pantone中匹配颜色

文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.总结 1.介绍 本文介绍一款免费插件&#xff0c;加强illustrator使用人员工作效率&#xff0c;实现查找选中颜色与pantone中匹配颜色。首先从下载网址下载这款插件https://download.csdn.net/download/m0_6731…...

redis集合类型

练习命令使用&#xff0c;具体如下&#xff1a; 练习无序集合类型命令 sadd smembers scard srem sinter sunion sdiff sismember srandmember spop 练习有序集合类型命令 无序集合中的每个元素都是不同的&#xff0c;且没有顺序 创建/追加/删除/查看 127.0.0.1:6379>…...

[爬虫实战] 爬微博图片:xpath的具体运用

博客配套代码发布于github&#xff1a;微博图片 相关知识点&#xff1a;图片懒加载 [爬虫知识] 数据解析 相关爬虫专栏&#xff1a;JS逆向爬虫实战 爬虫知识点合集 爬虫实战案例 这里我们以网页微博图片为例&#xff0c;尝试获取该页面下所有图片并保存。 一、分析网站 刷…...

MySQL中简单的操作

一.数据库 1.1数据库的建立&#xff1a; create database 库名&#xff1b; 1.2数据库的查看&#xff1a; show databases&#xff1b; 1.3数据库的删除&#xff1a; drop database 库名&#xff1b; 二.数据库中的表 2.1表的建立&#xff1a; create table 表名&…...

NNG和DDS

NNG (Nanomsg Next Generation) 和 DDS (Data Distribution Service) 是两种不同的通信协议&#xff0c;各自在不同场景下具有其优势。下面我将对这两种技术进行详细解释&#xff0c;并通过具体的例子来说明它们如何应用在实际场景中。 1. NNG (Nanomsg Next Generation) NNG简…...

防震基座在半导体晶圆制造设备抛光机详细应用案例-江苏泊苏系统集成有限公司

在半导体制造领域&#xff0c;晶圆抛光作为关键工序&#xff0c;对设备稳定性要求近乎苛刻。哪怕极其细微的振动&#xff0c;都可能对晶圆表面质量产生严重影响&#xff0c;进而左右芯片制造的成败。以下为您呈现一个防震基座在半导体晶圆制造设备抛光机上的经典应用案例。 企…...

框架开发与原生开发的权衡:React案例分析(原生JavaScript)

文章目录 框架开发与原生开发的权衡&#xff1a;React案例分析引言框架开发的优势开发效率提升状态管理的便捷性组件复用与生态系统团队协作与规范统一 原生开发的优势性能优化空间学习曲线平缓精细控制与定制化避免版本依赖与迁移成本 实际应用案例分析大型企业应用性能关键型…...

Lua5.4.2常用API整理记录

一、基础函数 1.type(value)​​ 返回值的类型&#xff08;如 "nil", "number", "string", "table", "function" 等&#xff09;。 代码测试&#xff1a; a 0 print(type(a)) a nil print(type(a)) a "aaaaaaaa&…...

Python打卡训练营学习记录Day36

仔细回顾一下神经网络到目前的内容&#xff0c;没跟上进度的同学补一下进度。 作业&#xff1a;对之前的信贷项目&#xff0c;利用神经网络训练下&#xff0c;尝试用到目前的知识点让代码更加规范和美观。 import pandas as pd #用于数据处理和分析&#xff0c;可处理表格数…...

### Mac电脑推送文件至Gitee仓库步骤详解

**核心流程及命令说明&#xff1a;** #### 1. **配置全局Git用户信息** bash git config --global user.name "shenguanling" git config --global user.email "3259125968qq.com" - **作用**&#xff1a;设置提交代码时的作者信息&#xff0…...

官方SDK停更后的选择:开源维护的Bugly Unity SDK

腾讯Bugly&#xff0c;为移动开发者提供专业的异常上报和运营统计&#xff0c;帮助开发者快速发现并解决异常&#xff0c;同时掌握产品运营动态&#xff0c;及时跟进用户反馈。 但是&#xff0c;免费版的Unity SDK已经很久不更新了&#xff0c;会有一些问题和特性缺失&#xff…...

什么是智能体agent?

文章目录 什么是智能体agent&#xff1f;最基本的核心思想我们是如何走到今天以及为什么是现在如何从思维上剖析“一个智能体系统”痛苦的教训结论 什么是智能体agent&#xff1f; 原文链接&#xff1a;https://windsurf.com/blog/what-is-an-agent 本文探讨了AI智能体的核心概…...

【多线程】Java 实现方式及其优缺点

以下是 Java 多线程实现方式及其优缺点的详细说明&#xff1a; 一、Java 多线程核心实现方式 1. 继承 Thread 类 public class MyThread extends Thread {Overridepublic void run() {System.out.println("Thread running: " Thread.currentThread().getName());}…...

Obsidian 数据可视化深度实践:用 DataviewJS 与 Charts 插件构建智能日报系统

Obsidian 数据可视化深度实践&#xff1a;用 DataviewJS 与 Charts 插件构建智能日报系统 一、核心架构解析 本系统基于 Obsidian 的 DataviewJS 和 Charts 插件&#xff0c;实现日报数据的自动采集、可视化分析及智能回溯功能&#xff08;系统架构原理见&#xff09;。其技术…...

Three.js 海量模型加载性能优化指南

一、性能瓶颈分析 1.1 常见性能杀手 问题类型典型表现影响范围Draw Call 爆炸每帧渲染调用超过1000次GPU 渲染性能内存占用过高浏览器进程内存突破1GB加载速度/崩溃风险模型文件过大单个GLB文件超过50MB网络传输时间几何数据冗余重复模型独立加载CPU/GPU资源浪费 1.2 性能监…...

6.4.3_有向无环图描述表达式

有向无环图&#xff1a; 有向图中不存在环即为有向无环图DAG图&#xff0c;即如下V0->V4->v3->V0或者V4->V1->v4就存在环不是有向无环图&#xff0c;即在一个路径中一个顶点不能出现2次&#xff1f; DAG描述表达式&#xff1a; 算术表达式用树来表示&#xff0…...

力扣第157场双周赛

1. 最大质数子字符串之和 给定一个字符串 s&#xff0c;找出可以由其 子字符串 组成的 3个最大的不同质数 的和。 返回这些质数的 总和 &#xff0c;如果少于 3 个不同的质数&#xff0c;则返回 所有 不同质数的和。 质数是大于 1 且只有两个因数的自然数&#xff1a;1和它本身…...

青少年编程与数学 02-019 Rust 编程基础 19课题、项目发布

青少年编程与数学 02-019 Rust 编程基础 19课题、项目发布 一、准备工作1. 创建和配置项目2. 编写代码和测试3. 文档注释 二、构建发布版本1. 构建优化后的可执行文件2. 静态链接&#xff08;可选&#xff09; 三、发布到 crates.io1. Crates.io核心功能使用方法特点最新动态 2…...

【HarmonyOS Next之旅】DevEco Studio使用指南(二十五) -> 端云一体化开发 -> 业务介绍(二)

目录 1 -> 工作原理 2 -> 约束与限制 2.1 -> 支持的设备 2.2 -> 支持的国家/地区 2.3 -> 支持的签名方式 3 -> 总结 3.1 -> 关键功能与工具 3.2 -> 开发流程 3.3 -> 典型场景与优化 3.4 -> 常见问题与解决 3.5 -> 总结 1 -> 工…...

LLaMA-Factory 微调模型与训练数据量对应关系

在使用LLaMA-Factory的LoRA技术微调1.5B和7B模型时&#xff0c;数据量需求主要取决于任务类型、数据质量以及模型规模。以下是基于现有研究和实践的具体分析&#xff1a; 一、数据量需求的核心影响因素 模型规模与数据量的关系 通常情况下&#xff0c;模型参数越多&#xff08…...

数据库与Redis数据一致性解决方案

在写数据时保证 Redis 和数据库数据一致,可采用以下方案,需根据业务场景权衡选择: 1. 先更新数据库,再更新 Redis 步骤: 写入 / 更新数据库数据。删除或更新 Redis 缓存。适用场景:读多写少,对缓存一致性要求不高(短暂不一致可接受)。风险:若第二步失败,导致缓存与…...

Spring Boot AI 之 Chat Client API 使用大全

ChatClient提供了一套流畅的API用于与AI模型交互,同时支持同步和流式两种编程模型。 流畅API包含构建Prompt组成元素的方法,这些Prompt将作为输入传递给AI模型。从API角度来看,Prompt由一系列消息组成,其中包含指导AI模型输出和行为的指令文本。 AI模型主要处理两类消息: …...

分身空间:手机分身多开工具,轻松实现多账号登录

分身空间是一款功能强大的手机分身多开工具APP&#xff0c;专为需要同时登录多个账号的用户设计。它支持多开各种游戏和软件&#xff0c;让用户可以轻松实现多账号同时在线&#xff0c;提升使用效率和体验。无论是社交软件、游戏还是办公应用&#xff0c;分身空间都能帮助你轻松…...

音视频之视频压缩及数字视频基础概念

系列文章&#xff1a; 1、音视频之视频压缩技术及数字视频综述 一、视频压缩编码技术综述&#xff1a; 1、信息化与视频通信&#xff1a; 什么是信息&#xff1a; 众所周知&#xff0c;人类社会的三大支柱是物质、能量和信息。具体而言&#xff0c;农业现代化的支柱是物质&…...

Ubuntu 24.04部署安装Honeyd蜜罐

&#x1f334; 前言 最近有个大作业&#xff0c;里面要求我们部署Hoenyd蜜罐&#xff0c;在网上搜了一通&#xff0c;发现相关的教程竟然少的可怜&#xff0c;即使有比较详细的教程&#xff0c;也是好几年前的了&#xff0c;跟着做一遍报一堆错&#xff0c;无奈之下&#xff0…...

C++复习核心精华

一、内存管理与智能指针 内存管理是C区别于其他高级语言的关键特性&#xff0c;掌握好它就掌握了C的灵魂。 1. 原始指针与内存泄漏 先来看看传统C的内存管理方式&#xff1a; void oldWay() {int* p new int(42); // 分配内存// 如果这里发生异常或提前return&#xff0c…...