Lua学习笔记

文章目录

  • 前言
  • 1. Lua的数据类型
  • 2. Lua的控制结构
    • 2.1 循环
      • 2.1.1 for
      • 2.1.1.1 数值循环
      • 2.1.1.2 迭代循环
      • 2.1.2 while
      • 2.1.3 repeat-until
    • 2.2 条件语句
    • 2.3 函数
  • 3. Lua中的变量作用域


前言

Lua是一种轻量级的、高效的、可扩展的脚本语言,由巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)的一个小团队开发。Lua的设计目标是成为一种嵌入式的脚本语言,因此它的语法简单、易于学习、易于嵌入其他程序中,并且运行速度非常快。
所以Lua是一种上手成本很低的脚本语言。
这里放下Lua代码与注释,方便快速上手,下再详细介绍

--注释方式
--[[多行注释
--]]
--********************变量类型********************
--lua中所有的变量 不需要申明变量类型
--lua中的所有变量 默认为全局变量  非全局前面加local
--lua中没有各种数值类型 统一都是Number类型 表示浮点数和
print("*************全局本地变量*************")
local a = 1 --局部 仅限于本文本访问  编程时 尽量都加local 
print(a)
a1 = 1.5 --全局 
print(a1)
--lua中只有false和nil才为假  0和空字符串为真
e = true;
print(e)
--lua中的string 可以用单引号或者双引号括起来
print("*************字符串相关*************")
b = '单引号字符串'
print(b)
c = "双引号字符串"
print(c)
--lua中字符串的换行 省略了\n换行替代符号
c = [[我是
你的
小宝贝
]]
print(c)
--字符串相关
str = "abCdefg"
print(string.upper(str))--小写转大写
print(string.lower(str))--大写转小写
print(string.reverse(str))--翻转字符串
print(string.find(str, "Cde"))--字符串索引查找
print(string.sub(str, 3))--字符串截取
print(string.rep(str, 3))--字符串重复
print(string.gsub(str, "Cd", "**"))--字符串修改
print(#str)--字符串长度
a = true
print(tostring(a));print(string.format("我是%s,我今年%d岁了", "小宝贝", 2))--字符串长度
--lua中空的关键字时nil 相当于C#中的null
print("*************空引用*************")
d = nil
print(d)
print("*************类型获取*************")
--字符串拼接符号..
--type 类型判断
print("类型判断"..type(e))--********************运算符********************
print("*************运算符*************")
--lua中没有自增减运算符
print("加法运算"..1+2)
print("余数运算"..9%2)
print("减法运算"..9-2)
print("乘法运算"..9*2)
print("除法运算"..9/2)
print("幂运算"..9^2)
--********************条件分支语句********************
print("*************条件分支语句*************")
a = 9
if a > 9 thenprint("大于9")
elseif a >= 5 thenprint("大于5")
elseif a == 3 then print("值为3")
elseif a ~= 2 then --不等于print("值为3")
end
--********************逻辑运算符********************
print("*************逻辑运算符*************")
a = true
b = false
if a and b then --逻辑与print("大于9")
elseif a or b5 then --逻辑或print("大于5")
elseif not a then -- 逻辑否print("其它数")
end
--********************循环语句********************
print("*************循环语句*************")
--while 循环
print("*************while循环*************");
num = 0
while num < 5 doprint(num);num = num + 1
end
--do while 循环
print("*************do while循环*************");
a = 1;
repeatprint(a);a = a + 1
until a > 5
--for循环
print("*************for循环*************");
for i = 1,5 do --默认递增+1print(i)
endfor i = 5,1,-1 do --递减1print(i)
end
--********************函数********************
print("*************函数*************")
function f(x) return x^2
end		
print(f(2))function f2(x2) if x2 < 10 thenprint("白卷")elseif x2 < 60 thenprint("分太低")elseif x2 < 70 thenprint("及格")end
end
f2(2)
print("*************变长参数函数*************")
function ff( ... )local arg = {...}local total = 0for i=1,#arg dototal = total + arg[i]endprint(total)
end
ff(1,2,3,4,5,6)print("*************函数嵌套*************")
function f3(x)return function(y) return x + y end
end
a = f3(1)
print(a(2))--********************复杂数据类型********************
print("*************复杂数据类型*************")
--所有的复杂类型都是table(表)
--数组
print("*************数组,列表*************")
--数组的存储类型可以混合,默认索引从1开始
a = {1,2,3,"12312",123123}
print(a[1])
print(a[4])
print(#a)--打印长度 从1开始计数 
print("*************数组遍历*************")
for i=1,#a doprint(a[i])
end
--可以自定义索引 甚至负索引
print("*************自定义索引*************")
a = {[0]=1,2,3,[-1]=4,5}
print(a[0])
print(a[1])
print(a[-1])
print(a[2])
print(a[3])
print(#a)--打印长度 中间产生索引断裂了 会停止计数
print("*************二维数组*************")
a = {{1,2,3},{4,5,6}}
print(a[1][1])
print(a[1][2])
print(a[1][3])
print(a[2][1])
print(a[2][2])
print(a[2][3])
--迭代器遍历
print("*************ipairs迭代遍历键值*************")
a = {[0] = 1,2,[-1] = 3,4,5}
--遍历键值
for i,k in ipairs(a) doprint("ipairs遍历键"..i)print("ipairs遍历值"..k)
end
print("*************pairs迭代遍历键值*************")
for i,k in pairs(a) doprint("pairs遍历键"..i)print("pairs遍历值"..k)
end
print("*************迭代遍历键*************")
--遍历键
for i in pairs(a) doprint("键"..i)
end
print("*************字典*************")
a = {["1"] = 5, ["2"] = 4}
print(a["1"])
print(a["2"])
print("*************类*************")
student = {--年龄age = 1,--性别sex = 0,--unity成绩unity = 90,--成长行为Up = function(self)self.age = self.age + 1print("我成长了"..self.age)end,--上课行为Learn = function( )print("学习")end
}student.Learn()
student.Up(student)
student:Up()
--student.Learn()
student.age = 2
print(student.age)print("*************特殊用法*************")
a,b,c = 1,2,3,4 --4会被忽略
print(a)
print(b)
print(c)
a,b,c = 1,2 --c会变为nil
print(a)
print(b)
print(c)--多个返回值
function Test()return 10,20,30,40
enda,b,c = Test()
print(a)
print(b)
print(c)

1. Lua的数据类型

nil类型

  • 表示一个空值或者无效值。

boolean类型

  • 表示真或假,只有两个取值:true和false。

number类型

  • 表示实数,可以是整数或者浮点数。

string类型

  • 表示字符串,可以包含任意字符。

table类型

  • 表示一种关联数组,可以用来表示各种复杂的数据结构。

function类型

  • 表示一个函数,可以接受参数并返回值。

userdata类型

  • 表示一个用户自定义的数据类型,通常是一个C语言对象或者结构体。

thread类型

  • 表示一个协程,用于支持多线程编程。

Lua的数据类型比较简单,但是非常灵活。其中,table类型是Lua中最为重要和常用的数据类型,可以用来表示各种复杂的数据结构,比如数组、列表、集合、图等等。同时,Lua还支持元表(metatable)的概念,可以通过元表来定义自定义的操作符、方法、属性等,使得Lua的数据类型更加灵活和强大。

无需声明一个变量就可使用,不过在赋值之前,变量的值为nil,表示不存在。
Lua为动态类型语言,变量的类型可以动态改变。

print(a) -- nil
print(type(a)) -- nil
a= 1
print(a) -- 1
print(type(a)) -- number
a= "abc" 
print(a) -- abc
print(type(a)) -- string

注意事项
number
所有数字都是双精度浮点数。

nil
虽然nil的类型是nil,但是type(nil)返回的是字符串"nil"。

string
拼接字符串使用…而不是加号。1+"1"会得到2.0。

table
table是key-value形式的表,可以嵌套。
初始化格式tb = {[key1] = value1, [key2] = value2, …},如tb = {[“a”] = “hello”, [“b”] = {1, 2, 3}}。
使用tb[key]来取对应的value值,表中没有的项会返回nil;使用tb[key] = value的形式来更新表。

数组
Lua中数组的本质是一个table。
使用tb = {“a”, “b”, “c”}的形式初始化一个数组,等同于tb = {[1] = “a”, [2] = “b”, [3] = “c”}。
要注意数组的序号是从1开始的,并且数组中元素的数据类型不需要一致。

变量作用域
变量默认是全局的,一处定义到处使用。
使用local关键字修饰变量,可以将其变为局部变量。

2. Lua的控制结构

条件语句(if语句)
用于根据条件来执行不同的代码块。

循环语句(while语句、repeat-until语句、for语句)
用于重复执行一段代码块。

分支语句(switch语句)
用于根据不同的值来执行不同的代码块。

函数调用语句(function语句)
用于定义和调用函数。

赋值语句(赋值运算符)
用于给变量或表的元素赋值。

局部变量定义语句(local语句)
用于定义局部变量,其作用域仅限于当前块内。

控制语句(break语句、return语句)
用于控制程序的流程。

其中,if语句和while语句是Lua中最常用的控制结构,常用于条件判断和循环操作。for语句可以用于迭代数组和列表等数据结构,repeat-until语句用于至少执行一次的循环。switch语句在Lua中没有原生的实现,但可以用一些技巧来实现类似的功能。函数调用语句和赋值语句是Lua中最基本的操作,也是Lua程序中最常用的语句。局部变量定义语句可以避免变量名冲突,提高程序的可读性和可维护性。控制语句用于控制程序的流程,可以使程序更加灵活和高效。

2.1 循环

2.1.1 for

循环有两种方式:数值循环和迭代循环。

2.1.1.1 数值循环

数值循环格式:

for i = 起始值, 结束值, 间隔值 do-- statements
end

其中,间隔值为1的时候可以省略。

2.1.1.2 迭代循环

遍历表tb:

tb = {["a"] = "hello", ["b"] = 2}
for k,v in pairs(tb) doprint(k, v)
end

其中,pairs为内置函数,提供了table的迭代器。

2.1.2 while

while格式:

while(condition)
do-- statements
end

2.1.3 repeat-until

repeat-until格式:

repeat-- statements
until( condition )

2.2 条件语句

格式:

if(cond1) then-- statements
elseif(cond2) then-- statements
elseif(cond3) then-- statements
...
else-- statements
end

2.3 函数

function类型的变量有两种定义方式,二者等价。调用的时候记得加括号,不然就是一个普通的变量。

function a(num)print("hello "..num)
end
a(5) -- hello 5
print(a) -- 变量地址
print(type(a)) -- function
a = function()print("a")
end
a() -- a
print(a) -- 变量地址
print(type(a)) -- function
a -- 报错

有几点需要注意:

  1. 函数可以嵌套;
  2. 函数默认是全局的,即使是嵌套在其他函数中;如果要定义局部函数,使用local关键字。

例:

function a()print("a")function b()print("b")endc = function()print("c")endlocal function d()print("d")end
enda() -- a
b() -- b
c() -- c
d() -- 报错,局部函数外部不能访问

可变长参数
使用…表示可变长的参数。
使用pairs{…}来获取变长参数的迭代器。
使用select(“#”, …)来获取传入的可变长参数个数。

f = function(...) -- 可变参数函数print("一共有"..select("#", ...).."个参数")for k, v in pairs{...} doprint(k..": "..v)end
end
f("a", "b", "c")

运算符
数学运算:
+、-、*、/:加减乘除
%:求余
^:求幂

关系运算:
==:等于
~=:不等于

、<、>=、<=:大于、小于、大于等于、小于等于

逻辑运算:
and:与
or:或
not:否

其他:
…:字符串连接
#:返回字符串或表的长度

3. Lua中的变量作用域

Lua中的变量作用域分为全局变量和局部变量两种。

全局变量
在函数外部定义的变量都是全局变量,全局变量可以在程序的任何位置被访问和修改。如果在函数内部访问全局变量,需要使用全局变量名(加上"_G."前缀)来访问。

局部变量
在函数内部定义的变量都是局部变量,局部变量的作用域仅限于当前函数内部。局部变量的好处是可以避免变量名冲突,提高程序的可读性和可维护性。在Lua中,可以使用关键字"local"来定义局部变量。

在Lua中,变量的作用域是静态的,也就是说,在程序运行之前就已经确定了变量的作用域。如果在同一作用域内出现了重名的变量,则后面的变量会覆盖前面的变量。在Lua中,变量的作用域是基于块(block)的,块可以嵌套,内部块的变量可以访问外部块的变量,但是外部块的变量不能访问内部块的变量。在Lua中,一个块可以是一个函数体、一个if语句、一个while语句、一个for语句等。

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

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

相关文章

学习c语言的链表的概念、操作(另一篇链表的笔记在其他的栏目先看这个)

在学习Linux之间我们先插入一下链表的知识 学习链表&#xff08;一种数据结构思想&#xff09; 链表和数组的区别和实现&#xff1a; 链表&#xff08;链表是个好东西&#xff09; 链表概念&#xff08;什么是链表&#xff09;&#xff1f; 链表就是数据结构->数据的存储…

NVM完全指南:安装、配置与最佳实践

发布于 2025年5月7日 • 阅读时间&#xff1a;10分钟 &#x1f4a1; TL;DR: 本文详细介绍了如何完整卸载旧版Node.js&#xff0c;安装NVM&#xff0c;配置阿里云镜像源&#xff0c;以及设置node_global与node_cache目录&#xff0c;打造高效Node.js开发环境。 &#x1f4cb; 目…

转换算子和行动算子的区别

转换算子和行动算子主要是在分布式计算框架&#xff08;如 Apache Spark&#xff09;里常用的概念&#xff0c;它们在功能、执行机制、返回结果等方面存在明显区别&#xff0c;以下为你详细介绍&#xff1a; 定义与功能 返回结果 如何在使用转换算子和行动算子时避免出现内存溢…

Windows命令行软件管理器:Chocolatey

文章目录 Windows命令行软件管理器&#xff1a;Chocolatey1.Chocolatey使用1.1 安装1.2 常用命令1.3 使用流程 2.常用shell命令汇总 Windows命令行软件管理器&#xff1a;Chocolatey Chocolatey 是一款强大的 Windows 命令行软件管理器&#xff0c;目前在 GitHub 上已斩获 10.…

MySQL 8.0 OCP(1Z0-908)英文题库(11-20)

目录 第11题题目分析正确答案 第12题题目分析正确答案 第13题题目分析正确答案 第14题题目分析正确答案 第15题题目分析正确答案 第16题题目分析正确答案 第17题题目分析正确答案&#xff1a; 第18题题目分析正确答案 第19题题目分析正确答案 第20题题目分析正确答案 第11题 W…

mac 使用 Docker 安装向量数据库Milvus独立版的保姆级别教程

Milvus 特点&#xff1a;开源的云原生向量数据库&#xff0c;支持多种索引类型和GPU加速&#xff0c;能够在亿级向量规模下实现低延迟高吞吐。具有灵活的部署选项和强大的社区支持。 适用场景&#xff1a;适合处理超大规模数据和高性能需求的应用&#xff0c;如图像搜索、推荐…

一款独立于游戏外的键盘源按键辅助工具他来了

一款独立于游戏外的键盘源按键辅助工具 一&#xff01;不需要安装&#xff0c;下载即用 二&#xff01;只要熟悉hekili体系 三&#xff01;略懂wa定制 四&#xff01;知道如何循环并且会自行模拟 五&#xff01;会simc最好 直接就上手了&#xff01; 我们的不是一键宏&…

python学生作业提交管理系统-在线作业提交系统

目录 技术栈介绍具体实现截图系统设计研究方法&#xff1a;设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理&#xff0c;难度适中&#xf…

Spring Boot + Vue 实现在线视频教育平台

一、项目技术选型 前端技术&#xff1a; HTML CSS JavaScript Vue.js 前端框架 后端技术&#xff1a; Spring Boot 轻量级后端框架 MyBatis 持久层框架 数据库&#xff1a; MySQL 5.x / 8.0 开发环境&#xff1a; IDE&#xff1a;Eclipse / IntelliJ IDEA JDK&…

引文索引数据库在科研中的应用

如何利用引文索引数据库高效检索、分析研究论文&#xff0c;发现高水平论文&#xff0c;锁定特定领域的经典文献&#xff1f;如何跟踪最新研究进展&#xff1f; 回放链接 image.png image.png image.png image.png image.png image.png image.png image.png image.png image.pn…

《供应链网络攻击的风险与防范》

中国古语有云&#xff1a;“千里之堤&#xff0c;溃于蚁穴。”供应链攻击正是利用这种系统性弱点发起攻势。近年来&#xff0c;随着国内数字化转型加速&#xff0c;供应链安全问题频发。从某盟删库事件到某头部物流企业数据泄露&#xff0c;从某国产工业软件遭恶意代码植入到某…

ETL介绍及kettle等工具学习

ETL介绍及kettle等工具学习 1. 什么是ETL&#xff1f; ETL&#xff08;Extract, Transform, Load&#xff09;是数据集成领域的核心流程&#xff0c;用于将数据从多个分散的源系统中抽取、清洗、转换后加载到目标数据仓库或数据湖中&#xff0c;以支持分析、报表和决策。其核…

图形渲染+事件处理最终版

基于之前做的项目图形移动处理-CSDN博客添加了相机&#xff0c;透视投影&#xff0c;鼠标控制图形旋转。虽然个人感觉这个项目用的是一个二维的三角形&#xff0c;给他加透视投影和相机意义不大&#xff0c;因为透视投影是近大远小&#xff0c;我这个程序设置了放大缩小的限制&…

G口大带宽服务器线路怎么选

G口大带宽服务器线路选择指南 ​​一、线路类型与特点​​ ​​单线&#xff08;电信/联通/移动&#xff09;​​ ​​优势​​&#xff1a;带宽独享、价格低、延迟稳定&#xff0c;适合单一运营商用户集中场景。​​劣势​​&#xff1a;跨运营商访问延迟高&#xff08;如电信…

HTML10:iframe内联框架

iframe内部框架 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>内联框架学习</title> </head> <body> <!--iframe内联框架 src:地址 width-height:高度宽度 --> <iframe…

基于 Spring Boot 瑞吉外卖系统开发(十一)

基于 Spring Boot 瑞吉外卖系统开发&#xff08;十一&#xff09; 菜品启售和停售 “批量启售”、“批量停售”、操作列的售卖状态绑定单击事件&#xff0c;触发单击事件时&#xff0c;最终携带需要修改售卖状态的菜品id以post请求方式向“/dish/status/{params.status}”发送…

springboot war包tomcat中运行报错,启动过滤器异常,一个或多个筛选器启动失败。

错误信息&#xff1a; "level": "ERROR", "thread": "localhost-startStop-1", "class": "o.a.c.c.C.[.[localhost].[/Crmeb-admin]", …

Cursor —— AI编辑器 使用详解

Cursor - The AI Code Editor 一、Cursor 是什么&#xff1f; Cursor 是一款优秀的AI代码编辑器&#xff0c;它内置了 Deepseek-R1、GPT-4、Claude等 AI 模型。 简单说&#xff0c;就是&#xff1a;Cursor VS Code 编辑器 AI 大模型 Cursor 功能特性&#xff08;代码补全、…

在Excel图表添加辅助线

前言&#xff1a;博主最近是有点忙&#xff0c;好吧&#xff0c;就是很忙&#xff0c;但我也不想水文章的&#xff0c;每一篇文章都是本人精心编辑&#xff0c;觉得对大家有用才发布的。而且同一个类型的文章&#xff0c;我基本都会写在同一篇中方便大家集中获取。本来这篇文章…

2025.5.8总结(中期审视)

今日记录&#xff1a; 晚上&#xff0c;主管找我聊了关于中期绩效审视的问题。 首先就是让我汇报上半年的工作进展&#xff0c;汇报完后&#xff0c;感觉体现不出自己的工作量&#xff0c;这确实考验个人的汇报能力。 汇报完工作后&#xff0c;主管开始给我提了一些建设性的…