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

Lua 基础 01 入门

Lua 基础相关知识 第一期

注释

--  单行注释--[[多行注释
--]]-- 多加一个横杠符号就能重新启用注释内的代码
---[[print("Lua")
--]]

数据类型

Lua 是动态类型语言,变量不需要类型定义,只需要为变量赋值。

Lua 有 8 种基本类型:

  1. nil(表示一个无效值,条件表达式中表示 false)
  2. boolean(false 或 true,0 也是 true)
  3. number(表示双精度类型的实浮点数)
  4. string(字符串,由一对单引号或双引号包括,也可以用两个方括号)
  5. table(表,是一个关联数组,数组的索引可以是数字、字符串或表类型)
  6. function(函数)
  7. userdata(表示任意存储在变量中的 C 语言数据结构)
  8. thread(表示执行的独立线程,用于执行协同程序)

可以使用 type() 函数查看数据类型。

print(type(nil))     -- nil
print(type(true))    -- boolean
print(type(1))       -- number
print(type("Lua"))   -- string
print(type({}))      -- table
print(type(print))   -- function

布尔

false 或 true,但需要注意,Lua 把除了 false 和 nil 以外的值都视为 true,例如 0 和 "" 都是 true。

逻辑运算符 and,or,not 的使用:

  1. and,如果第一个操作数为 false,就返回第一个操作数,否则返回第二个操作数。
  2. or,如果第一个操作数为 true,就返回第一个操作数,否则返回第二个操作数。
  3. not,取反。

and 和 or 都是短路求值,只有在必要时才会计算第二个操作数。

常见的写法:

a = a or 0  -- 如果 a 不存在,则使用默认值 0a = x < y and x or y  -- 类似三目运算符,但不完全是
-- 操作过程 ---- 若 x < y 为 true,则 ( x < y and x ) 返回 x
-- 接着 x or y,若 x 存在则为 true,返回 x ( 如果此时 x 不存在或 false,则返回 y,这里是跟三目运算符的区别)-- 若 x < y 为 false,则 ( x < y and x ) 返回 x < y 的结果 false
-- 接着 false or y,返回 ynot nil    -- true
not false  -- true
not true   -- false
not 0      -- false

字符串

在对一个数字字符串进行算术运算时,Lua 会尝试将字符串转成数字。

其他语言,例如 C#,是把数字转成字符串进行连接,这里要注意 Lua 的处理方式。

print("1" + 2)  -- 3

而连接字符串则使用 … 符号。

print("How " .. "are " .. "you")  -- How are you

计算字符串长度用 # 符号。

print(#"hello")  -- 5

字符串可以使用两个方括号表示。

html = [[
<html>
<head></head>
<body><p>Lua</p>
</body>
</html>
]]print(html)--[[ 打印结果也有换行<html>
<head></head>
<body><p>Lua</p>
</body>
</html>--]]

如果字符串的内容也有两个方括号,就会有语法错误,此时可以在最外围的两对方括号中间添加 = 号。

html = [=[
<html>
<head></head>
<body><p>Lua 这里多出的 ]] 会和 [[ 匹配,后面的内容就不被包括在字符串内了</p>
</body>
</html>
]=]

表可以看成是数组或哈希表,取决于 key 值是从 1 开始的连续正整数还是其他类型。

如果没有指定 key 值,默认就是数组。

不同于其他语言,Lua 的数组索引是从 1 开始的。

table = { "a", "b", "c" }
print(table[1])  -- a
print(table[2])  -- b
print(table[3])  -- c

指定 key 值,就变成了哈希表。可以使用 [] 或 . 的方式获取 value 值。

table = {["name"] = "Alice",["age"] = 18,
}
print(table["name"])  -- Alice
print(table.age)      -- 18

需要注意的是,如果直接给表赋值第三个位置的值,那么前两个位置的值会自动填充为 nil。

table = {[3] = "Alice",
}
print(table[1])  -- nil
print(table[2])  -- nil
print(table[3])  -- Alice

计算表的长度也是用 # 符号,前提是数组的形式,哈希表不适用(只能计算 key 值为连续正整数的部分)。

table = { "a", "b", "c" }
print(#table)  -- 3table = {[1] = "a",[3] = "c"
}
print(#table)  -- 1table = {[1] = "a",["2"] = "b",  -- key 值为字符串[3] = "c"
}print(#table)  -- 1

如果要判断表是否为空,可以使用 next() 函数,获取下一个键值对。

table = {}
print(next(table) == nil)  -- truetable = { "a" }
print(next(table) == nil)  -- false

函数

函数使用 function 定义,指定函数名和参数,end 结尾。

function Add(a, b)return a + b
endprint(Add(1, 2))  -- 3

函数可以保存到变量中,也可以保存到表中。

add = function (a, b)return a + b
end
print(add(1, 2))  -- 3table = {["add"] = add
}
print(table["add"](1, 2))   -- 3
print(table.add(1, 2))      -- 3

变量

Lua 中声明变量默认是全局变量,只有在变量前添加 local 关键字才是局部变量。

a = 1         -- 全局变量
local b = 2   -- 局部变量

可以同时对多个变量进行赋值。

a, b = 5, 6
print(a, b)  -- 5 6

赋值前,Lua 会先计算右边的值再赋值,所以可以简便地进行变量的交换。

a, b = 5, 6
a, b = b, a
print(a, b)  -- 6 5

当变量的个数和值的个数不同时,Lua 会采取以下策略:

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

分支循环

分支

分支结构如下,每个 if 后面要接 then,最后以 end 结尾。

local score = 60
if score < 60 thenprint("不及格")
elseif score < 80 thenprint("及格")
elseif score < 100 thenprint("优秀")
elseprint("超标")
end-- 及格

循环

循环结构如下,指定 i 的初始值、终止值、步长。

for i = 1, 5, 1 doprint("i = " .. i)
end-- i = 1
-- i = 2
-- i = 3
-- i = 4
-- i = 5

遍历表

有三种方法遍历表,常规的第一种如下:

table = { "a", "b", "c" }-- #table 获取 table 的长度
for i = 1, #table, 1 doprint(table[i])
end-- a
-- b
-- c

第二种是使用 pairs 方法:

table = { "a", "b", "c" }for key, value in pairs(table) doprint("key = " .. key .. " value = " .. value)
end-- key = 1 value = a
-- key = 2 value = b
-- key = 3 value = c

第三种是使用 ipairs 方法:

table = { "a", "b", "c" }for key, value in ipairs(table) doprint("key = " .. key .. " value = " .. value)
end-- key = 1 value = a
-- key = 2 value = b
-- key = 3 value = c

pairs 和 ipairs 的区别

pairs,遍历所有键值对,顺序随机,可以返回 nil。

ipairs,从 key 值为 1 开始顺序遍历,key 值不连续则会停止,不能返回 nil。

例 1,表中有两个键值对,缺失了 key 为 2 的值。

pairs 会遍历所有键值对,ipairs 只会遍历第一个键值对,因为找不到 key 为 2 的值,就停止了。

table = {[1] = "a",[3] = "c"
}for key, value in pairs(table) doprint("key = " .. key .. " value = " .. value)
end-- key = 1 value = a
-- key = 3 value = cfor key, value in ipairs(table) doprint("key = " .. key .. " value = " .. value)
end-- key = 1 value = a

例 2,补上了一个键值对,但是 key 值是字符串 "2"

pairs 依然会遍历所有键值对,但是顺序乱了。ipairs 依然只能遍历第一个键值对。

table = {[1] = "a",["2"] = "b",  -- key 值为字符串[3] = "c"
}for key, value in pairs(table) doprint("key = " .. key .. " value = " .. value)
end-- key = 3 value = c
-- key = 1 value = a
-- key = 2 value = bfor key, value in ipairs(table) doprint("key = " .. key .. " value = " .. value)
end-- key = 1 value = a

相关文章:

Lua 基础 01 入门

Lua 基础相关知识 第一期 注释 -- 单行注释--[[多行注释 --]]-- 多加一个横杠符号就能重新启用注释内的代码 ---[[print("Lua") --]]数据类型 Lua 是动态类型语言&#xff0c;变量不需要类型定义&#xff0c;只需要为变量赋值。 Lua 有 8 种基本类型&#xff1a…...

远程连接阿里云ECS

说明&#xff1a;ECS&#xff08;阿里云服务器&#xff09;可选择的系统镜像如下&#xff1a; 本文介绍基于Windows系统&#xff0c;对CentOS、Ubuntu、Windows这三个操作系统的连接方式&#xff0c;以及连接工具Windterm的使用。 CentOS & Windterm CentOS是我使用时间最…...

【C++】多态(上)超详细

封装&#xff0c;继承&#xff0c;多态不只是C的三大特性&#xff0c;而是面向对象编程的三大特性。 什么是多态&#xff1a; 不同的对象做同一件事情&#xff0c;结果会出现多种形态。 1.满足多态的几个条件 1.父子类完成虚函数重写&#xff08;需要满足三同&#xff1a;函…...

【Git】 Git分支操作指南

隐形的纪念躲在心里面 也许吧 也许不会再见 阴天或晴天 一天又一年 风它在对我说莫忘这一切 &#x1f3b5; 蔡淳佳《隐形纪念》 Git是一种非常强大的分布式版本控制系统&#xff0c;允许用户在开发过程中创建不同的分支&#xff08;branch&#xff09;来分…...

智慧文旅赋能旅游服务升级:以科技创新驱动行业变革,打造智慧化、个性化、高效化的旅游新体验,满足游客日益增长的多元化需求

目录 一、引言 二、智慧文旅的概念与内涵 三、智慧文旅在旅游服务升级中的应用 1、智慧旅游服务平台建设 2、智慧景区管理 3、智慧旅游营销 四、智慧文旅推动旅游行业变革的案例分析 案例一&#xff1a;某智慧旅游城市建设项目 案例二&#xff1a;某景区智慧化改造项目…...

AtCoder Beginner Contest 310 E题 NAND repeatedly

E题&#xff1a;NAND repeatedly 标签&#xff1a;动态规划题意&#xff1a;给定一个长度为 n n n的 01 01 01字符串 A i A_i Ai​&#xff0c;给定规则&#xff1a; 0 ⊼ 0 1 , 0 ⊼ 1 1 , 1 ⊼ 0 1 , 1 ⊼ 1 0 0⊼01,0⊼11,1⊼01,1⊼10 0⊼01,0⊼11,1⊼01,1⊼10。 求 ∑…...

一款简易的免费抽奖软件

一、介绍 这款抽奖软件设计简洁&#xff0c;操作便捷。用户可以轻松将参与名单通过EXCEL文件导入至程序中&#xff0c;并可根据需要设定各类奖品和对应的中奖人数。在选定了奖品后&#xff0c;用户只需点击“开始”按钮&#xff0c;随后再按下“暂停”按钮&#xff0c;软件便会…...

Kubernetes 监控管理

目录 1. Metrics Server2. Prometheus & Grafana3. cAdvisor4. 日志收集5. 告警与通知6. 最佳实践 Kubernetes 监控管理是确保集群稳定运行和应用服务质量的关键环节。它涉及收集、聚合、分析集群及其上运行的应用程序的各种指标和日志数据。 1. Metrics Server 作用&…...

哈希表第6/9题--四数相加II

题目描述&#xff1a; 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1&#xff1a; 输入&…...

使用JavaScript将富文本HTML转换为纯文本

在Web开发中&#xff0c;我们经常需要处理HTML内容&#xff0c;但有时为了特定的目的&#xff0c;比如文本处理、搜索或显示在非HTML环境中&#xff0c;我们可能希望将富文本HTML转换为纯文本。这里&#xff0c;我们将探讨如何使用JavaScript来实现这一功能。 为什么要将HTML转…...

2024-05-13 问AI: 介绍一下 google wavenet 声码器

文心一言 Google的WaveNet声码器是一个深度学习模型&#xff0c;用于生成高质量的音频信号&#xff0c;特别是人类语音。与传统的声码器相比&#xff0c;WaveNet可以生成更加自然和流畅的音频&#xff0c;因为它直接模拟了原始音频信号的波形生成过程。 WaveNet的核心思想是使…...

当代 Qt 正确的 安装方法 及 多版本切换

此文写于 20240511 首先去网站Index of /official_releases/online_installers下载一个安装器 安装器有什么用? 可以浏览安装版本 安装组件 安装器版本越能 能装的东西越多 现在只能选Qt5 和 Qt6 至于你公司用的Qt4 我也没招 见招时再拆招 安装器 默认国外源 可以换国内…...

matlab使用教程(70)—修改坐标区属性

1.控制坐标轴长度比率和数据单位长度 您可以控制 x 轴、y 轴和 z 轴的相对长度&#xff08;图框纵横比&#xff09;&#xff0c;也可以控制一个数据单位沿每个轴的相对长度&#xff08;数据纵横比&#xff09;。 1.1图框纵横比 图框纵横比是 x 轴、y 轴和 z 轴的相对长度。默认…...

手撕C语言题典——反转链表

目录 前言 一.思路 1&#xff09;创建新链表 2&#xff09;创建三个指针 二.代码实现 搭配食用更佳哦~~ 数据结构之单单单——链表-CSDN博客 数据结构之单链表的基本操作-CSDN博客 前面学了单链表的相关知识&#xff0c;我们来尝试做一下关于顺序表的经典算法题~ 前言 反转…...

用lobehub打造一个永久免费的AI个人助理

Lobe Chat是一个开源的高性能聊天机器人框架&#xff0c;它被设计来帮助用户轻松创建和部署自己的聊天机器人。这个框架支持多种智能功能&#xff0c;比如语音合成&#xff08;就是让机器人能说话&#xff09;&#xff0c;还能理解和处理多种类型的信息&#xff0c;不仅限于文字…...

Linux网络编程】传输层中的TCP和UDP(UDP篇)

【Linux网络编程】传输层中的TCP和UDP&#xff08;UDP篇&#xff09; 目录 【Linux网络编程】传输层中的TCP和UDP&#xff08;UDP篇&#xff09;传输层再谈端口端口号范围划分认识知名端口号netstatiostatpidofxargs UDP协议UDP协议端格式UDP的特点面向数据报UDP的缓冲数据UDP使…...

Ciphey无法安装的解决办法

安装过程纯属自己实践&#xff0c;满满干货 困扰我几天的问题终于解决了 我看着教程在window上安装 python3.8/python3.9/python3.10无论如何都安装不上&#xff0c; 在win10虚拟机仍然安装不上 可能是我电脑环境问题 解决办法&#xff1a; 在kali中安装&#xff0c;但是…...

交互之舞:Processing中的用户互动与响应设计

前言&#xff1a; &#x1f31f;在前两篇文章中&#xff0c;我们已经学会了如何绘制静态图形和创建动态动画。今天&#xff0c;我们将迈入一个新的领域——交互设计。在Processing中&#xff0c;用户互动是创造沉浸式体验的关键。让我们一起探索如何让用户与你的艺术作品互动&…...

unetr_plus_plus(UNETR++、nnU-Net)系列数据处理理解汇总

unetr_plus_plus&#xff08;UNETR、nnU-Net&#xff09;系列数据处理理解汇总&#xff0c;这是一个 3D 图像分割的任务系列集。 为什么说他们是一个系列集合呢&#xff1f;主要是因为&#xff1a; 论文的训练和评价数据集是一样的&#xff0c;都是来自于10全挑战赛&#xff…...

稻盛和夫《活法》读后感

最近几天又重读了一边稻盛和夫的《活法》&#xff0c;里面的观点让我感触颇多&#xff0c;现分享给诸君。 稻盛和夫毕业后&#xff0c;适逢经济萧条&#xff0c;没有好机会进入大公司深造&#xff0c;只能在一名教授的推荐下进入了一家做陶瓷绝缘体的公司&#xff0c;虽然公司…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...

Python常用模块:time、os、shutil与flask初探

一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...

嵌入式面试常问问题

以下内容面向嵌入式/系统方向的初学者与面试备考者,全面梳理了以下几大板块,并在每个板块末尾列出常见的面试问答思路,帮助你既能夯实基础,又能应对面试挑战。 一、TCP/IP 协议 1.1 TCP/IP 五层模型概述 链路层(Link Layer) 包括网卡驱动、以太网、Wi‑Fi、PPP 等。负责…...