【Lua语言】Lua语言快速入门

初始Lua

       Lua是一种轻量小巧的脚本语言,他使用标准C语言编写并以源代码形式开放。这意味着Lua虚拟机可以很方便的嵌入别的程序中,从而为应用程序提供灵活的扩展和定制功能。同时,在目前脚本引擎中,Lua的运行速度占有绝对优势

变量

number变量(这个类型与C语言的double类型类似)

       变量,可以看做是一个桶,在里面装入自己想装的内容。这些内容可以是Lua包含的所有合法类型。例如,我想创建一个变量,里面放入920这个数字:

bucket = 920 (全局变量)

       不过,这样写的话,这个变量是全局变量,在其他文件也可以使用到。如果我们只想在本文件下使用,我们可以使用local修饰变量,如下所示:

local bucket = 920

了解nil(与null类似)

       nil类型表示没有任何有效值,只要是没有生命的值,他就是nil。比如打印一个没有创建的变量,就会输出nil:

ccc = 233
print(ccc)
print(aaa)  --nil

在Lua中,nil和0是有区别的:

含义差异:

  • nil:在Lua中,nil是一种特殊的数据类型,他只有一个值,也就是nil。nil一般用于表示一个变量未被赋值或者某个值不存在。
  • 0:0属于数字类型,代表数值零,在数字运算以及逻辑判断等场景中使用

逻辑判断中的表现:

  • 在条件判断里,除了 nil 和 false 会被视为假,其他值(包含 0)都被视为真。下面是示例代码:
  • -- 判断0和nil在条件判断中的表现
    if 0 thenprint("0在条件判断中被视为真")
    elseprint("0在条件判断中被视为假")
    endif nil thenprint("nil在条件判断中被视为真")
    elseprint("nil在条件判断中被视为假")
    end

赋值和使用情况:

  • nil:当一个变量被赋值为 nil 时,就相当于将这个变量删除,后续若使用该变量就会引发错误(除非再次赋值)。
  • 00 是一个正常的数值,可用于各种数学运算和逻辑操作。

赋值语句

赋值是改变一个变量值的最基本的方法,如下面一样,使用等号对左边的变量进行赋值。

n = 2
n = 3
n = n + 1
b = n

注意:在 Lua 里,并没有像 C、Java 这类语言中使用的 ++ 自增运算符,也没有 n += 1 这种复合赋值运算符。不过,你可以使用其他方式来实现相同的功能。

 Lua可以对多个变量同时赋值,变量使用逗号分开,赋值语句右边的值会依次赋值给左边的变量。

n = 1
a, b = 10, 2*n

当左右值的数量不一致时,Lua会进行下面的设定:

  • 变量个数 > 值的个数:按变量个数补足nil
  • 变量个数 < 值的个数:多余的值会被忽略
a, b, c = 0, 1
print(a,b,c)
--输出0   1   nila, b = a+1, b+1, b+2
print(a,b)
--输出1   2a, b, c = 0
print(a,b,c)
--输出0   nil   nil

数值型

       在Lua中,数值型(number)是一种基本的数据类型,用于表示数字。下面从多个方面对Lua中的数值型进行介绍:

表示范围

       在 Lua 5.3 及之后的版本中,数值型默认采用双精度浮点数(64 位)来表示,能够表示非常大或者非常小的数。其表示范围大致为 ±1.8×10^308 ,精度约为 15 - 17 位十进制数字。而在早期的 Lua 版本中,数值型使用的是双精度浮点数或者整数(取决于编译选项)。

整数和浮点数

       在 Lua 5.3 及后续版本中,数值型可以表示整数和浮点数。

整数

可以直接使用没有小数点的数字来表示整数,例如:

local num1 = 10
local num2 = -20

浮点数

使用带小数点或者科学计数法的数字来表示浮点数,例如:

local num3 = 3.14
local num4 = 1.23e-5  -- 表示1.23×10^(-5)

类型判断

可以使用 type() 函数来判断一个变量是否为数值型,示例如下:

local num = 5
if type(num) == "number" thenprint("num是数值型")
end

数字运算

       数值型变量能够进行常见的数学运算,例如加(+)、减(-)、乘(*)、除(/)、取模(%)、幂运算(^)等,示例代码如下:

local a = 10
local b = 3
local sum = a + b
local difference = a - b
local product = a * b
local quotient = a / b
local remainder = a % b
local power = a ^ bprint("和: ", sum)
print("差: ", difference)
print("积: ", product)
print("商: ", quotient)
print("余数: ", remainder)
print("幂: ", power)

整数和浮点数的转换

       在 Lua 中,整数和浮点数之间可以进行隐式转换。例如,在进行某些运算时,整数可能会转换为浮点数:

local num1 = 5
local num2 = 2
local result = num1 / num2  -- 这里结果是浮点数2.5

也可以使用 math.floor()math.ceil() 和 math.modf() 等函数进行显式转换:

local num = 3.14
local floor_num = math.floor(num)  -- 向下取整,结果为3
local ceil_num = math.ceil(num)    -- 向上取整,结果为4
local integer_part, fractional_part = math.modf(num)  -- 分离整数部分和小数部分

特殊数值

       Lua 中的数值型还包含一些特殊数值,例如 math.huge 表示正无穷大,-math.huge 表示负无穷大,0/0 会得到 nan(非数值):

local inf = math.huge
local neg_inf = -math.huge
local nan = 0/0print("正无穷大: ", inf)
print("负无穷大: ", neg_inf)
print("非数值: ", nan)

字符串

string类型变量

       字符串(即string),就是一串文本数据,可以存储你要的文本。print出的数据就是一个字符串。Lua语言中字符串可以使用以下三种方式来表示:

  • 单引号间的一串字符
  • 双引号间的一串字符
  • [[ 和 ]]间的一串字符
--双引号间的一串字符
str1 = "Lua"
--单引号间的一串字符
str2 = 'Lua'
--[[和]]--间的一串字符
str3 = [[Lua]]
str4 = [[使用双括号时,甚至能包含换行数据
换行了
最后一行]]--输出所有字符串
print(str1)
print(str2)
print(str3)
print(str4)

转义字符

       转义字符用于表示不能直接显示的字符,比如后退键、回车键、等。以 \ 开头的都是转义字符,下面时常用的转义字符格式:

string拼接

       字符串和字符串可以相加,我们可以使用拼接符号来将两个独立的字符串拼起来。我们使用 .. 来表示字符串拼接符号:

print('abc'..'def')
str1 = '123'
str2 = '999'
print(str1..str2)

number和string的转换

       我们可以直接将number类型的变量n转换成string类型的值,这样就可以拼接了。使用tostring(value)函数即可实现这一操作:

n = 123
s = 'm/s'result = tostring(n)..s
print(result)

       我们可以直接将string类型的变量s转换成number类型的值,这样就可以计算了。使用tonumber(value)函数即可实现这一操作:

n = 123
s = '2333'result = tonumber(s) + n
print(result)

函数

local变量

       全局变量在代码运行周期从头到尾,都不会被销毁,而且随处都可以调用。当代码量增加时,很多时候大量新建全局变量会导致内存激增,我们需要一种可以临时使用、并且可以自动销毁释放内存资源的变量,我们可以使用local标志来新建临时变量,使用local创建一个局部变量,与全局变量不同,局部变量只在被声明的那个代码块内有效。

a = 123
function add()local n = a+2print(n)
end
add()
print(n)

函数参数

       函数内是可以传参的,这里传入的参数等价于在函数内部新建了一个local变量,修改这些数据不会影响外部的数据(除了后面还没有讲到的table类型)

函数返回值

这里需要注意的是,函数可以返回多个值。

table

认识数组

       数组,使用一个变量名,存储一系列的值。在Lua中,我们可以使用tables(表)来实现这个功能。在Lua中,table是一个一系列元素的集合,使用大括号进行表示,其中的元素之间以逗号分隔,类似下面的代码:

t = {1,3,8,5,4}

       我们可以直接使用元素的下标来访问,或者对该元素进行赋值操作。在上面的table中,第一个元素的下标是1,第二个是2,依次类推

简单table

       table中可以存储任意类型的数据,比如,我们可以在table中放置number和string数据,还可以放置函数,类似于下面的代码:

t = {"abc",223,",..a",123123}t = {function() return 123 end,function() print("abc") end,function(a,b) return a+b end,function() print("hello world") end,
}
t[1]()
t[2]()
t[3](1,2)
t[4]()

这些table访问每一个元素的方式任然是直接使用下标,并且可以使用下标来进行修改。 

table下标

在Lua中,下标可以直接在声明时进行指定,像下面这样:

t = {6,7,8,9}
--上面和下面的代码等价
t = {[1] = 6,[2] = 7,[3] = 8,[4] = 9,
}--甚至你可以跳过某些下标
t = {[1] = 6,[3] = 7,[5] = 8,[7] = 9,
}
print(t[7])
--输出9--在声明后赋予元素值也是可以的
t = {}--空的table
t[101] = 10
print(t[101])
--输出10

有上面可以自定义下标,那么我们也可以自定义字符串下标,代码如下所示:

t = {["apple"] = 10,banana = 12,pear = 6,
}
--使用["下标"] = 值
--和  下标 = 值
--都是正确写法
--当第二种方式有歧义时,应该用第一种方式--可以用下面两种方式访问:
print(t["apple"])
--输出10
print(t.apple)
--输出10
--当第二种方式有歧义时,应该用第一种方式

Lua全局变量与table

实际上,在Lua中,所有的全局变量全部被存放在了一个大table中,这个table名为:_G

table增删

table.insert (table, [pos ,] value)

       在(数组型)表 table 的 pos 索引位置插入 value,其它元素向后移动到空的地方。pos 的默认值是表的长度加一,即默认是插在表的最后。

table.remove (table [, pos])

       在表 table 中删除索引为 pos(pos 只能是 number 型)的元素,并返回这个被删除的元素,它后面所有元素的索引值都会减一。pos 的默认值是表的长度,即默认是删除表的最后一个元素。

逻辑运算

布尔型和比较运算

       布尔型(boolean)只有两个可选值:true(真) 和 false(假)。Lua 把 false 和 nil 看作是false,其他的都为true(包括0这个值,也是相当于true

Lua 中也有许多的关系运算符,用于比较大小或比较是否相等,符号及其含义如下表:

逻辑运算符

       逻辑运算符基于布尔型的值来进行计算,并给出结果,下表列出了 Lua 语言中的常用逻辑运算符:

循环

while循环

while 继续循环判断依据 do执行的代码
end

for循环

for 临时变量名=开始值,结束值,步长 do循环的代码
end

中断循环

       有些时候循环运行到一半,我们不想再继续运行了,怎么办呢?我们可以在一个循环体中使用break,来立即结束本次循环,继续运行下面的代码:

result = 0
for i=1,100 doresult = result + iif result > 100 thenresult = result - ibreakend
endprint(result)

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

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

相关文章

车载诊断新架构--- SOVD初入门(上)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…

linux查看目录相关命令

查看目录命令 学习目标 能够使用Linux命令查看目录信息 1. 查看目录命令的使用 命令说明ls查看当前目录信息tree以树状方式显示目录信息 ls命令效果图: tree命令效果图: 2. 查看当前目录路径 命令说明pwd查看当前目录路径 pwd命令效果图: 3. 清除终端内容 命令说明clear…

JavaScript中的Event事件对象详解

一、事件对象&#xff08;Event&#xff09;概述 1. 事件对象的定义 event 对象是浏览器自动生成的对象&#xff0c;当用户与页面进行交互时&#xff08;如点击、键盘输入、鼠标移动等&#xff09;&#xff0c;事件触发时就会自动传递给事件处理函数。event 对象包含了与事件…

OSPF综合实验(HCIP)

1&#xff0c;R5为ISP&#xff0c;其上只能配置Ip地址&#xff1b;R4作为企业边界路由器&#xff0c; 出口公网地址需要通过ppp协议获取&#xff0c;并进行chap认证 2&#xff0c;整个OSPF环境IP基于172.16.0.0/16划分&#xff1b; 3&#xff0c;所有设备均可访问R5的环回&…

2024-04-19| Java: Documented注解学习 JavaDoc

在 Java 中&#xff0c;Documented 是一个元注解&#xff08;meta-annotation&#xff09;&#xff0c;用于标记其他注解&#xff0c;表明这些注解应该被包含在 JavaDoc 文档中。以下是关于 Documented 注解的作用的简要说明&#xff1a; 作用 记录注解信息到 JavaDoc&#x…

15.Chromium指纹浏览器开发教程之WebAudio指纹定制

WebAudio指纹概述 浏览器中的 WebAudio API 提供了丰富的功能&#xff0c;其中包括了大量生成和处理音频数据的API。WebAudio API 的音频指纹技术是一种利用音频信号的特征来唯一标识音频的技术。因为WebAudio API 提供了丰富的音频处理功能&#xff0c;包括合成、过滤、分析等…

2025年赣教云智慧作业微课PPT模板

江西的老师们注意&#xff0c;2025年赣教云智慧作业微课PPT模版和往年不一样&#xff0c;千万不要搞错了&#xff0c;图上的才是正确的2025年的赣教云智慧作业微课PPT模版&#xff0c;赣教云智慧作业官网有问题&#xff0c;无法正确下载该模板&#xff0c;需要该模板的&#xf…

2.5.1DOS下常用工具 curl,netstat,telnet命令使用

curl命令 Win10及以上系统默认已安装Curl&#xff0c;打开命令提示符输入 curl --help&#xff0c;若显示帮助信息则无需安装 ​​手动安装方法​​ 官网下载&#xff1a;访问 curl官网 选择Windows版本curl for Windows若需在 Windows XP 等旧系统使用&#xff0c;需选择更…

使用Redis实现实时排行榜

为了实现一个实时排行榜系统&#xff0c;我们可以使用Redis的有序集合&#xff08;ZSet&#xff09;&#xff0c;其底层通常是使用跳跃表实现的。有序集合允许我们按照分数&#xff08;score&#xff09;对成员&#xff08;member&#xff09;进行排序&#xff0c;因此非常适合…

Linux——firewalld防火墙(笔记)

目录 一&#xff1a;Firewalld防火墙的概述 &#xff08;1&#xff09;firewalld简介 &#xff08;2&#xff09;firewalld&iptables的关系 &#xff08;3&#xff09;firewalld与iptables service的区别 1. ‌规则管理方式‌ 2. ‌默认策略与设计逻辑‌ 3. ‌配置文…

JS中实现类似sleep、wait、delay的延时功能

前言 编写代码时很多时候需要进行流程化的操作&#xff0c;各个流程间通常需要等待一定时间&#xff0c;这在很多语言中通常可以使用 sleep 、 wait 、 delay 等函数来实现。JavaScript原生并没有类似的功能&#xff0c;想要延时通常就是使用 setTimeout(functionRef, delay) …

Elasticsearch:使用 ES|QL 进行搜索和过滤

本教程展示了 ES|QL 语法的示例。请参考 Query DSL 版本&#xff0c;以获得等效的 Query DSL 语法示例。 这是一个使用 ES|QL 进行全文搜索和语义搜索基础知识的实践介绍。 有关 ES|QL 中所有搜索功能的概述&#xff0c;请参考《使用 ES|QL 进行搜索》。 在这个场景中&#x…

Java 动态代理实现

Java 动态代理实现 一、JDK动态代理二、CGLIB动态代理三、动态代理的应用场景四、JDK代理与CGLIB代理比较 动态代理是Java中一种强大的技术&#xff0c;它允许在运行时创建代理对象&#xff0c;用于拦截对目标对象的方法调用。 一、JDK动态代理 JDK动态代理是Java标准库提供的代…

Apache IoTDB V2.0.2/V1.3.4 发布|新增表模型权限管理、UDF、嵌套查询功能

Release Announcement Version 2.0.2/1.3.4 Apache IoTDB V2.0.2、V1.3.4 已经发布&#xff01; V2.0.2 作为树表双模型正式版本&#xff0c;主要新增表模型权限管理、用户管理以及相关操作鉴权&#xff0c;并新增了表模型 UDF、系统表和嵌套查询等功能。 V1.3.4 主要新增模式…

鸿蒙开发11-ARKUI框架

ARKUI&#xff08;方舟 UI 框架&#xff09;是 HarmonyOS Next&#xff08;原 OpenHarmony&#xff09;的核心 UI 开发框架&#xff0c;基于声明式编程范式&#xff0c;支持 ArkTS 语言&#xff0c;能够高效构建跨设备的响应式应用。以下是对 ARKUI 框架及开发的详细介绍&#…

Linux 进程间通信详解

一.进程间通信介绍 1. 进程间通信概念 进程间通信&#xff08;Inter-Process Communication, IPC&#xff09;是指在不同进程之间传递或交换信息的一种机制。在操作系统中&#xff0c;进程是资源分配和独立运行的基本单位&#xff0c;它们拥有各自独立的内存空间和系统资源。…

从0开始掌握动态规划

动态规划的核心思想 -- 以空间换时间 复杂点说通过分解问题为子问题并存储子问题解来优化复杂计算的算法策略。 简单看个问题。 一&#xff0c;初始&#xff1a;求最长连续递增子序列 nums [10,9,2,5,3,7,101,18] 求上面数组中的最长连续递增子序列&#xff0c;输出其长度 …

Python Requests 库:从安装到精通

摘要 本文详细介绍 Python Requests 库的安装与使用&#xff0c;通过常见示例让你轻松掌握。 一、引言 在当今的互联网时代&#xff0c;与各种 Web 服务进行交互是非常常见的需求。Python 作为一门功能强大且易于学习的编程语言&#xff0c;提供了许多用于网络请求的库&…

Manus技术架构、实现内幕及分布式智能体项目实战

Manus技术架构、实现内幕及分布式智能体项目实战 模块一&#xff1a; 剖析Manus分布式多智能体全生命周期、九大核心模块及MCP协议&#xff0c;构建低幻觉、高效且具备动态失败处理能力的Manus系统。 模块二&#xff1a; 解析Manus大模型Agent操作电脑的原理与关键API&#xf…

C算术运算符 printf输出格式 字符指针打印输出 使用scanf函数进行输入

一 算术运算符 加, 一元取正 - 减, 一元取负 * 乘 / 除 % 求余 -- 自减1 自加1 逻辑运算符 && 逻辑与 || 逻辑或 ! 逻辑非 关系运算符 > 大于 > 大于等于 < 小于 < 小于等于 等于 ! 不等于 位运算符号 & 按位与 | 按位或 ^ 按位异或…