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

Lua语言入门(自用)

全局与非全局

在lua语言当中没有被local表示的是全局变量

反之则是本地变量(仅仅作用在某个文件,函数,或者代码块)

下面是实例代码和运行结果

--hello.luaA = 10;--这样就是全局变量,然后这个编译器如果是大写就是默认的全局变量
local b = 3;--这样就是局部变量--reference.luarequire('hello')--这里面的require就相当于Python里面的import或者c++当中的include
print(A);--这个按照原来的脚本打印10
print(b);--这样会打印nil

变量类型

Lua当中没有像我们以前学过的众多语言清晰可见,在Lua当中任何的数值,比如int,long ing,short int 在Lua当中都是用number这个变量来表示的

然后string都是差不多的,具体的实现请参考官方文档

最后就是table类型我个人认为是最具特色的类型,放到后面详细讲解

下面是代码演示:

A = 1.131
B = 200
C = 1.251254121
print(type(A),type(B),type(C))

字符串类型

字符串类型可以通过许多种方式来定义,下面是代码实例:

local a = 'string1'
local b = "string2"
local c = [[
yes \n dsadq
sdaw
]]print(a,b,c)

在Lua当中字符串一旦创建就不可变,如何理解:

str有一个对象是"Hello"

过了几个星期,str玩腻了又想找"World",这个时候str就会和"World"在一起而"Hello"一个人站在原地,所以没有变

local str = "Hello"
str = str .. " World"  -- 拼接字符串,生成一个新的字符串
print(str)  -- 输出: Hello World

此外可以通过"#"的方式查看字符串的长度

S = "456"
print(#S) --返回的值是3

最后就是string.的一些相关函数,其实和其他的语言差不多这里就不多讲解啦

函数

1. 函数的定义

Lua 中的函数可以通过以下方式定义:

  • 普通函数:使用 function 关键字。

  • 匿名函数:使用 function 关键字但不指定函数名。

  • 表方法:将函数作为表的成员。

-- 普通函数
function add(a, b)return a + b
end-- 匿名函数
local multiply = function(a, b)return a * b
end-- 表方法
local mathUtils = {add = add,multiply = multiply
}

2. 函数的调用

  • 函数可以通过函数名加括号的方式调用。

  • 如果函数没有参数,也必须加上括号(除非是单参数且为字符串或表)。

local result1 = add(1, 2)  -- 调用普通函数
local result2 = multiply(3, 4)  -- 调用匿名函数
local result3 = mathUtils.add(5, 6)  -- 调用表方法

3. 函数的参数

  • Lua 函数的参数是按值传递的(对于表、函数等引用类型,传递的是引用)。

  • Lua 函数支持可变参数(Varargs),使用 ... 表示。

function sum(...)local result = 0for i, v in ipairs({...}) doresult = result + vendreturn result
endprint(sum(1, 2, 3, 4))  -- 输出: 10

4. 函数的返回值

  • Lua 函数可以返回多个值。

  • 如果函数没有显式返回值,默认返回 nil

function swap(a, b)return b, a
endlocal x, y = swap(1, 2)
print(x, y)  -- 输出: 2 1

5. 匿名函数与高阶函数

  • Lua 支持匿名函数(Lambda 表达式),可以作为参数传递给其他函数。

  • 高阶函数是指接受函数作为参数或返回函数的函数。

-- 高阶函数
function apply(func, a, b)return func(a, b)
end-- 匿名函数作为参数
local result = apply(function(a, b) return a + b end, 3, 4)
print(result)  -- 输出: 7

6. 闭包(Closure)个人认为非常优雅

  • Lua 支持闭包,即函数可以捕获并访问其外部作用域的变量。

  • 闭包在回调函数、延迟计算等场景中非常有用。

function createCounter()local count = 0return function()count = count + 1return countend
endlocal counter = createCounter()
print(counter())  -- 输出: 1
print(counter())  -- 输出: 2

7. 函数与表

  • 函数可以作为表的成员(方法)。

  • Lua 提供了一种特殊的语法糖 :,用于定义和调用表方法(自动传递 self 参数),在显示项目中经常用到,我感觉和类很像但是不确定,具体的要之后参与实际项目实践看看。

示例
local person = {name = "Alice",greet = function(self)print("Hello, " .. self.name)end
}-- 使用 : 语法糖
function person:shout()print(self.name .. " is shouting!")
endperson:greet()  -- 输出: Hello, Alice
person:shout()  -- 输出: Alice is shouting!

表分为两种,一种全局表,和一种常规表

先说常规的表,就是自己定义的表,在表中可以存放所有的数据结构,函数也可以上面也有提

示例代码:

T = {1,'231515',function (a,b)return a,b;
end}

再就是表的一些相关函数,和其他语言中的链表差不多:

table.insert(T, "d")--默认是在最后一个位置插入的
print(T[4])table.insert(T, 2, "Insert in to")--这个是指定区域插入如果插入就是将后面所有的都向后移动一个
print(T[2])table.remove(T, 2) --移除table表中的一个东西
print(T[2])
--很明显这个时候就不是上面那个了local removed = table.remove(T, 1)--table还可以保存删除后的数据
print(removed)

全局表就是_G,这个表的作用就是将所有的全局变量都放在这个里面,所以我们就可以表里面调用表

U = {a = 1,b = 2,c = '3',e = function ()print("im e")end,['sda.,;'] = '鬼东西'
}print(U.e())--这里注意了,如果是要调用table表中的函数的话就需要添加()才行,不然就是返回它的地址了--除此之外还可以自行添加
U["abc"] = 123
print(U['abc'])--这样是可行的--如果我们定义变量的东西不是字母而是非常诡异的东西,那么我们就可以用[]来包括进去print(U['sda.,;']) --展示好像不能打印UTF-8,奇怪-- _G所有的全局变量都包含在_G里面
print(_G.A)
-- 同理可得,由于我们没有给上面的U这个table变成全局变量,所以他也包含在_G里面
print(_G.U['sda.,;'])

循环和条件语句

if语句和python的更加接近一点

local a = 10
local b = 20
if a > b thenprint("yes")
elseif a == b  thenprint("no")
elseprint(a)
end

while循环:


local i = 0
while true doi = i + 1 -- 注意在Lua里面没有i+=1这种操作if i == 6 thenbreakendprint(i)
end--结果
1
2
3
4
5

for循环:

for i = 1, 10, 1 doprint(i)
end

还有值得注意的一点是在Lua当中0表示的是True

if 0 thenprint('yes')
elseprint('false')
end

总结

到这里八成的Lua代码都可以写了,由于这个学期刚刚在UE项目实习,以后也会分享unlua项目的经验和心得,这次的Lua也是为了后面的做unlua做铺垫 

相关文章:

Lua语言入门(自用)

全局与非全局 在lua语言当中没有被local表示的是全局变量 反之则是本地变量(仅仅作用在某个文件,函数,或者代码块) 下面是实例代码和运行结果 --hello.luaA 10;--这样就是全局变量,然后这个编译器如果是大写就是默认的全局变量 local b 3;--这样就是局部变量--reference.…...

大数据开发平台的框架

根据你的需求,以下是从 GitHub 推荐的 10 个可以实现大数据开发平台的项目: 1. Apache Spark Apache Spark 是一个开源的分布式计算框架,适用于大规模数据处理和分析。它提供了强大的数据处理能力,支持实时数据处理、机器学习和…...

X86_64位下的GS寄存器

在 64 位模式下,段机制通常(但不是完全)被禁用,从而创建一个平坦的 64 位线性地址空间。处理器将 CS、DS、ES、SS 的段基地址视为零,从而创建一个与有效地址相等的线性地址。FS 和 GS 段是例外。这些段寄存器&#xff…...

#6【TIP2023】Dif-Fusion

📜 Dif-Fusion: Toward High Color Fidelity in Infrared and Visible Image Fusion With Diffusion Models 🍸 源码:https://github.com/GeoVectorMatrix/Dif-Fusion 🍺 前向扩散过程 前向过程看成是逐步加噪的Markov链,在每一个时间步 t t t ,...

科普:“git“与“github“

Git与GitHub的关系可以理解为:Git是一种软件工具,而GitHub则是一个在线平台,它们是“一家子”。二者的关联最直接体现在你通过Git在GitHub仓库中clone软件包到你的机器中来。 具体来说: 一、Git 定义:Git是一个开源的…...

unplugin-vue-components,unplugin-auto-import,借用ai去学习

好的,我现在需要帮助用户理解他们提供的这段Vite配置代码。用户之前已经询问过关于ElementPlusResolver的导入问题,现在他们展示了在vite.config.ts中使用该解析器的具体配置。我需要逐步分析这段代码,并解释每个部分的作用。 首先&#xff…...

蓝桥杯 2013 省 B 翻硬币

题目背景 小明正在玩一个“翻硬币”的游戏。 题目描述 桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零),比如可能情形是 **oo***oooo,如果同时翻转左边的两个硬币&…...

【硬件设计】DDR3、DDR4、DDR5、DDR6性能对比与硬件设计要点

目录 一、各代DDR技术核心性能指标对比 二、各代DDR技术特性详解 三、硬件设计通用原则与差异化需求 四、技术演进趋势总结 一、各代DDR技术核心性能指标对比 指标DDR3DDR4DDR5DDR6(预测)发布时间2007年2014年2020年预计2026年5传输速率800-1600 MT…...

生成式AI核心技术:扩散模型原理与实战优化

一、数学原理与算法演进 前向扩散过程: 通过T次迭代逐渐添加高斯噪声,β_t遵循cosine调度策略,保证信号平滑湮灭 反向去噪过程: 使用U-Net结构预测噪声,DDPM论文证明可通过简化损失函数实现稳定训练: …...

从网络基础到安全防护:网安运维小白的入门学习路线

今天的主题是给网络安全运维小白的学习建议。 事情是这样的,最近有一位想学网安(偏向网络运维)的新手小白询问我学习的方向和建议。我建议他可以从网络和Linux入手。后来他问了一个我认为非常有价值的问题:“网络部分到底是指什么…...

Python 进阶特性深度解析:从语法糖到内存管理的统一视角

生成式(推导式)的用法与内存效率分析 Python 的推导式不仅仅是语法糖,它们在内存管理和性能方面有着深刻的影响。理解推导式的工作原理,有助于我们写出更高效的代码。 推导式的内存模型分析 列表推导式在 CPython 解释器中的实现实际上比等价的 for 循环更为高效: # 列…...

Linux DMA Engine 基础

1 DMA基础信息查看 /sys/class/dma root:~# ls /sys/class/dma/ dma0chan0 dma1chan10 dma1chan27 dma2chan14 dma2chan30 dma2chan47 dma2chan63 dma3chan21 dma3chan38 dma3chan54 dma0chan1 dma1chan11 dma1chan28 dma2chan15 dma2chan31 dma2chan48 dma2…...

【JavaEE】SpringMVC 请求传参

目录 一、请求二、传递单个参数三、传递多个参数四、传递对象五、RequestParam注解 后端参数重命名(后端参数映射)六、传递数组七、传递集合,RequestParam八、传递JSON数据8.1 JSON字符串和Java对象互转8.1.1 Test注解8.1.2 Java对象转JSON8.…...

观察者模式说明(C语言版本)

观察者模式主要是为了实现一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。下面使用C语言实现了一个具体的应用示例,有需要的可以参考…...

LeetCode 230.二叉搜索树中第K小的元素

题目:给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(从 1 开始计数)。 思路: 代码: /*** Definition for a binary tree node.* public class Tre…...

11、集合框架

一、简介 Java集合框架位于java.util包中 Collection是Set和List的父类,Collections是工具类,提供了对集合进行排序、遍历等多种算法的实现。 ArrayList: 有序(放进去顺序和拿出来顺序一致),可重复 HashSet: 无序(放进去顺序和拿出来顺序不…...

git常用指令详解

文章目录 Git 基本指令的使用Git 远程仓库Git的分支管理 Git 基本指令的使用 git init //初始化一个git仓库,在当前目录下生成.git文件夹&#xff0c;并且会默认生成一个master分支。git clone <url> [directory] //url为git仓库地址&#xff0c;directory为本地目录 gi…...

Debezium 报错:“The db history topic is missing” 的处理方法

Debezium 报错:“The db history topic is missing” 的处理方法 一、引言 在使用 Debezium 进行数据同步时,可能会遇到一个常见的错误:“The db history topic is missing”。这个错误表明 Debezium 无法找到或访问其数据库历史记录主题(db history topic),这通常是由…...

Grok 3.0 Beta 版大语言模型评测

2025年2月17日至18日&#xff0c;全球首富埃隆马斯克&#xff08;Elon Musk&#xff09;携手其人工智能公司xAI&#xff0c;在美国重磅发布了Grok 3.0 Beta版。这款被誉为“迄今为止世界上最智能的语言模型”的AI&#xff0c;不仅集成了先进的“DeepSearch”搜索功能&#xff0…...

AcWing 3691:有向树形态 ← 卡特兰数 + 复旦大学考研机试题

【题目来源】 https://www.acwing.com/problem/content/3694/ 【题目描述】 求 N 个相同结点能够组成的二叉树的个数。 【输入格式】 一个整数 N。 【输出格式】 输出能组成的二叉树的个数。 【数据范围】 1≤N≤20 【输入样例】 3 【输出样例】 5 【算法分析】 ● 卡特…...

Halcon镜头畸变矫正后,你的标定板图像真的“干净”了吗?一个容易被忽略的细节

Halcon镜头畸变矫正后&#xff0c;你的标定板图像真的“干净”了吗&#xff1f;一个容易被忽略的细节 当你在Halcon中完成镜头畸变矫正后&#xff0c;看着那些原本弯曲的线条变得笔直&#xff0c;是否觉得大功告成&#xff1f;很多工程师在这一步会直接保存矫正后的图像&#…...

FPGA--Verilog 实现乒乓操作:从原理到工程实践(附完整代码)

1. 什么是乒乓操作&#xff1f; 乒乓操作是FPGA设计中一种经典的数据缓冲技术&#xff0c;它的核心思想就像打乒乓球一样&#xff0c;两个存储单元轮流接收和输出数据。想象一下有两个水桶&#xff0c;当一个水桶在接水时&#xff0c;另一个水桶在倒水&#xff0c;如此反复交替…...

SR锁存器不定态:从理论到实践的深度剖析

1. SR锁存器基础原理&#xff1a;从门电路到记忆单元 我第一次接触SR锁存器是在大学数字电路实验课上&#xff0c;当时看着两个简单的或非门就能实现"记忆"功能&#xff0c;感觉非常神奇。SR锁存器&#xff08;Set-Reset Latch&#xff09;确实是数字电路中最基础的记…...

Python的__complex__方法支持复数运算重载与数值类型系统的完整性

Python作为一门动态类型语言&#xff0c;其数值类型系统的灵活性一直备受开发者青睐。其中&#xff0c;复数作为数学计算的重要工具&#xff0c;在科学计算、信号处理等领域有着广泛应用。Python通过__complex__方法实现了对复数运算的重载支持&#xff0c;这不仅增强了语言的表…...

AGI在员工体验管理中的隐秘应用:从情绪语义分析到个性化发展路径生成(仅限头部科技公司内部验证)

第一章&#xff1a;AGI在员工体验管理中的隐秘应用&#xff1a;从情绪语义分析到个性化发展路径生成&#xff08;仅限头部科技公司内部验证&#xff09; 2026奇点智能技术大会(https://ml-summit.org) 在硅谷与西雅图的三座超算中心内&#xff0c;某头部AI原生企业已将AGI模型…...

别再踩坑了!Android 10+ 保存图片到相册的完整流程与权限处理(附完整代码)

Android 10 图片保存实战&#xff1a;避开Scoped Storage的12个深坑 每次看到同事在Android 10设备上调试图片保存功能时抓狂的样子&#xff0c;我都会想起自己曾经踩过的那些坑。从MediaStore的诡异行为到权限申请的玄学问题&#xff0c;这个看似简单的功能背后藏着太多"…...

别再死记硬背了!用Python+DCMTK快速提取DICOM图像中的关键信息(附代码)

PythonDCMTK实战&#xff1a;高效提取DICOM关键信息的工程化解决方案 在医学影像处理领域&#xff0c;DICOM文件就像一座数据金矿——但如何快速定位并提取Patient Name、Study Date或窗宽窗位等关键信息&#xff0c;却是许多开发者面临的现实挑战。传统的手动解析不仅效率低下…...

FreeRTOS任务优先级设置指南:以温湿度监测和LED控制为例(避坑分享)

FreeRTOS任务优先级设置实战&#xff1a;温湿度监测与LED控制的平衡艺术 在嵌入式系统开发中&#xff0c;任务优先级的合理分配往往决定了整个系统的响应性和稳定性。我曾在一个农业温室监控项目中&#xff0c;因为优先级设置不当导致温湿度数据采集延迟高达2秒&#xff0c;差点…...

从VS Code老手到鸿蒙新手:DevEco Studio 3.0保姆级上手避坑指南

从VS Code老手到鸿蒙新手&#xff1a;DevEco Studio 3.0保姆级上手避坑指南 如果你已经习惯了VS Code的轻量高效&#xff0c;初次打开DevEco Studio可能会觉得有些"重量级"——就像从自行车换到了全地形车。但别担心&#xff0c;这种"沉重感"背后是华为为…...

如何免费解锁VIP特权?终极开源音乐播放器完整指南

如何免费解锁VIP特权&#xff1f;终极开源音乐播放器完整指南 【免费下载链接】MoeKoeMusic 一款开源简洁高颜值的酷狗第三方客户端 An open-source, concise, and aesthetically pleasing third-party client for KuGou that supports Windows / macOS / Linux / Web :electro…...