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

news2025/4/21 22:32:44

初始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 then
        print("0在条件判断中被视为真")
    else
        print("0在条件判断中被视为假")
    end
    
    if nil then
        print("nil在条件判断中被视为真")
    else
        print("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   nil

a, b = a+1, b+1, b+2
print(a,b)
--输出1   2

a, 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" then
    print("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 ^ b

print("和: ", 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/0

print("正无穷大: ", 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+2
    print(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 do
    result = result + i
    if result > 100 then
        result = result - i
        break
    end
end

print(result)

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

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

相关文章

Silverlight发展历程(微软2021年已经停止支持Silverlight 5)

文章目录 Microsoft Silverlight 发展历程引言起源与背景&#xff08;2006-2007&#xff09;互联网技术格局与微软的挑战WPF/E 项目的启动 Silverlight 1.0 的诞生&#xff08;2007&#xff09;正式命名与首次发布初步的市场定位 Silverlight 2.0&#xff1a;真正的突破&#x…

充电桩领域垂直行业大模型分布式推理与训练平台建设方案 - 慧知开源充电桩平台

没有任何广告&#xff01; 充电桩领域垂直行业大模型分布式推理与训练平台建设方案 一、平台定位与核心价值 行业首个垂直化AI平台 专为充电桩运营场景设计的分布式大模型训练与推理基础设施&#xff0c;实现"算力-算法-场景"三位一体闭环管理。 核心价值主张&am…

区块链交易自动化新时代:实战体验 Maestro 智能机器人

随着 DeFi 和链上交易生态的不断壮大&#xff0c;链上自动化工具的应用正逐渐从「量化机构」走向普通投资者和开发者。在过去的几个月中&#xff0c;我实测了一款基于 Telegram 的交易机器人 —— Maestro&#xff0c;它极大简化了链上套利、复制交易等流程&#xff0c;对我个人…

windows服务器及网络:论如何安装(虚拟机)

今天我要介绍的是&#xff1a;在Windows中对于安装系统&#xff08;虚拟机的步骤以及相关的安装事宜&#xff09;&#xff0c;事不宜迟&#xff0c;让我们来看看系统安装&#xff08;虚拟机&#xff09;是怎么操作的&#xff1a; 对现在来说&#xff0c;安装电脑系统已经是非常…

Hbuilder 上的水印相机实现方案 (vue3 + vite + hbuilder)

效果 思路 通过 live-pusher 这个视频推流的组件来获取摄像头拿到视频的一帧图片之后&#xff0c;跳转到正常的 vue 页面&#xff0c;通过 canvas 来处理图片水印 源码 live-pusher 这个组件必须是 nvue 的 至于什么是 nvue&#xff0c;看这个官方文档吧 https://uniapp.dcl…

TinyEngine 2.4版本正式发布:文档全面开源,实现主题自定义,体验焕新升级!

本文由体验技术团队李璇原创。 前言 TinyEngine低代码引擎使开发者能够定制低代码平台。它是低代码平台的底座&#xff0c;提供可视化搭建页面等基础能力&#xff0c;既可以通过线上搭配组合&#xff0c;也可以通过cli创建个人工程进行二次开发&#xff0c;实时定制出自己的低…

毕业答辩的PPT应该包括哪些内容?

一、PPT 模板的选择 1. 忌单调的白底黑字&#xff0c;应进行一些艺术设计&#xff0c;使人看着画面舒服&#xff0c;但不必过于花哨。总之&#xff0c;专业制作&#xff0c;符合技术人士的喜好。 2. 去掉不相关信息&#xff0c;如一些下载模板上的LOGO。把学校或部门的LOGO放…

Vscode --- LinuxPrereqs │远程主机可能不符合 glibc 和 libstdc++ Vs code 服务器的先决条件

打开vscode连接远程linux服务器&#xff0c;发现连接失败&#xff0c;并出现如下报错信息&#xff1a; 原因是&#xff1a; vscode 官网公告如下&#xff1a;2025 年 3 月 (版本 1.99) - VSCode 编辑器 版本1.97 官网公告如下&#xff1a;链接 版本1.98 官网公告如下&am…

安装部署RabbitMQ

一、RabbitMQ安装部署 1、下载epel源 2、安装RabbitMQ 3、启动RabbitMQ web管理界面 启用插件 rabbitmq数据目录 创建rabbitmq用户 设置为管理员角色 给用户赋予权限 4、访问rabbitmq

Qt实现文件传输客户端(图文详解+代码详细注释)

Qt实现文件传输客户端 1、 客户端UI界面设计2、客户端2.1 添加网络模块和头文件2.2 创建Tcp对象2.3 连接按钮2.3.1 连接按钮连接信号与槽2.3.2 连接按钮实现 2.4 读取文件2.4.1 连接读取文件的信号与槽2.4.2 读取文件槽函数实现2.5 进度条2.5.1 设置进度条初始值2.5.2 初始化进…

机器学习期末

选择题 以下哪项不是机器学习的类型&#xff1f; A. 监督学习 B.无监督学习 C.半监督学习 D.全监督学习 D 哪一个是机器学习的合理定义? A、机器学习是计算机编程的科学 B、机器学习从标记的数据中学习 C、机器学习是允许机器人智能行动的领域 D、机器学习能使计算机能够在…

Python多任务编程:进程全面详解与实战指南

1. 进程基础概念 1.1 什么是进程&#xff1f; 进程(Process)是指正在执行的程序&#xff0c;是程序执行过程中的一次指令、数据集等的集合。简单来说&#xff0c;进程就是程序的一次执行过程&#xff0c;它是一个动态的概念。 想象你打开电脑上的音乐播放器听歌&#xff0c;…

【QT】 QT中的列表框-横向列表框-树状列表框-表格列表框

QT中的列表框-横向列表框-树状列表框-表格列表框 1.横向列表框(1)主要方法(2)信号(3) 示例代码1:(4) 现象&#xff1a;(5) 示例代码2&#xff1a;加载目录项在横向列表框显示(6) 现象&#xff1a; 2.树状列表框 QTreeWidget(1)使用思路(2)信号(3)常用的接口函数(4) 示例代码&am…

决策树:ID3,C4.5,CART树总结

树模型总结 决策树部分重点关注分叉的指标&#xff0c;多叉还是单叉&#xff0c;处理离散还是连续值&#xff0c;剪枝方法&#xff0c;以及回归还是分类 一、决策树 ID3(Iterative Dichotomiser 3) 、C4.5、CART决策树 ID3:确定分类规则判别指标、寻找能够最快速降低信息熵的方…

easyexcel使用模板填充excel坑点总结

1.单层map设置值是{属性}&#xff0c;那使用两层map进行设置值&#xff0c;是不是可以使用{属性.属性}&#xff0c;以为取出map里字段只用{属性}就可以设置值&#xff0c;那再加个.就可以从里边map取出对应属性&#xff0c;没有两层map写法 填充得到的文件打开报错 was empty (…

C# LINQ基础知识

简介 LINQ(Language Integrated Query)&#xff0c;语言集成查询&#xff0c;是一系列直接将查询功能集成到 C# 语言的技术统称。使用LINQ表达式可以对数据集合进行过滤、排序、分组、聚合、串联等操作。 例子&#xff1a; public class Person {public int Id;public string…

GCoNet+:更强大的团队协作 Co-Salient 目标检测器 2023 GCoNet+(翻译)

摘要 摘要&#xff1a;本文提出了一种新颖的端到端群体协作学习网络&#xff0c;名为GCoNet&#xff0c;它能够高效&#xff08;每秒250帧&#xff09;且有效地识别自然场景中的共同显著目标。所提出的GCoNet通过基于以下两个关键准则挖掘一致性表示&#xff0c;实现了共同显著…

QT常见输入类控件及其属性

Line Edit QLineEdit用来表示单行输入框&#xff0c;可以输入一段文本&#xff0c;但是不能换行 核心属性&#xff1a; 核心信号 信号 说明 void cursorPositionChanged(int old,int new) 当鼠标移动时发出此型号&#xff0c;old为先前位置&#xff0c;new为新位置 void …

Few-shot medical image segmentation with high-fidelity prototypes 论文总结

题目&#xff1a;Few-shot medical image segmentation with high-fidelity prototypes&#xff08;高精确原型&#xff09; 论文&#xff1a;Few-shot medical image segmentation with high-fidelity prototypes - ScienceDirect 源码&#xff1a;https://github.com/tntek/D…

如何使用Node-RED采集西门子PLC数据通过MQTT协议实现数据交互并WEB组态显示

需求概述 本章节主要实现一个流程&#xff1a;使用纵横智控的EG网关通过Node-red&#xff08;可视化编程&#xff09;采集PLC数据&#xff0c;并通过MQTT协议和VISION&#xff08;WEB组态&#xff09;实现数据交互。 以采集西门子PLC为例&#xff0c;要采集的PLC的IP、端口和点…