Lua 快速入门 · 教程笔记

Lua语言快速入门 · 教程笔记

  • 前言
  • 1. Lua 语言介绍
  • 2. Lua 语言基础之基本语法
    • 声明变量
    • 声明方法
    • 使用 if - else
    • 使用 for
    • 使用 while
  • 3. Lua 语言基础之表
  • 4. Lua 语言基础之数组
    • 插入元素
    • 移除元素
    • 获取表的长度
    • 全局表
  • 5. Lua 语言面向对象之复制表的方式面向对象
    • 实现继承和重写父类方法
  • 6. Lua语言面向对象之函数闭包的方式面向对象
    • 实现继承和重写父类方法
  • 额外补充
    • 字符串补充

前言

笔记的内容出自 Bilibili 上的这两个视频:

Lua语言快速入门精通(第 1 ~ 6 集)

【无废话30分钟】Lua快速入门教程 - 4K超清

前者组成了笔记的主要结构,后者作为前者的补充。笔记主要用于供笔者个人或读者回顾知识点,如有纰漏,烦请指出 : )

1. Lua 语言介绍

一般是使用 C/C++ 来实现功能,用 Lua 来实现逻辑。因为 Lua 作为一种动态的脚本语言,它可以在调用时进行解释或编译,不用像静态语言那样编译完毕才能运行。

2. Lua 语言基础之基本语法

声明变量

在 Lua 里,直接声明一个变量的话,它是作为全局变量存在的,它在另一个文件里也可以用。

如果想让它只对本地有作用则需要在前面加个 local。

num1 = 100			-- 作用于全局
local num2 = 200	-- 作用于本地
  • 在 Lua 里,nil 代表空值。
  • 在其他语言里 “不等于” 是 !=,但在 Lua 里是 ~=(波浪号和等于号)
  • 在 Lua 里,nilfalse 才代表 false;其他所有数都代表 true,包括 0

声明方法

最基础的方法声明与调用,如下所示:

-- 声明方法
function sayHello()
	print("Hello Lua")
end

sayHello()	-- 调用,输出 Hello Lua

使用 if - else

声明带参数的方法与调用,如下所示:

function max(a, b)
	-- if 语句的运用
	if a > b then
		return a
	else
		return b
	end
end

print(max(2, 3))	-- 输出 3
  • 如果中间想继续判断就用 elseif {表达式} then

使用 for

使用 for 循环:

-- 输出 1 到 100
for var = 1, 100 do
	print(var)
end
  • break 可以用于终止 for 和 while 的循环。

使用 while

使用 for 循环:

-- 输出 1 到 100
local var = 1
while var < 101 do
    print(var)
    var = var + 1 	-- 注意,Lua 不支持自减(-=)和自增(+=)
end

3. Lua 语言基础之表

表相当于一个装载键值对的容器,但是它里面什么都可以存放,示例如下:

Config = {}		-- 声明一个空表

-- 声明两个键值对
Config.words = "Hello"	-- 键是 words,值是 "Hello"
Config.num = 100		-- 键是 num,值是 100

-- 用中括号 [] 来声明键值对
Config["name"] = "ZhangSan"		-- 此处可看出键实际上是字符串

-- 通过表和键输出值
print(Config.words)		-- 输出 Hello
print(Config["num"])	-- 输出 100,如果不添加双引号则为 nil(为空)

由上我们可以得出一个规律:

  1. . 和键获取表内元素的时候 不需要 " "
  2. [ ] 和键获取表内元素的时候 配套使用 " "

我们也可以在声明表的同时声明内部元素,并且用 for 来遍历内部元素

-- 在声明表的同时声明内部元素
Config1 = {hello = "Hello lua", world = "World"}

-- 用 for 遍历表内元素
for key, var in pairs(Config1) do
	print(key, var)	
end

-- 输出如下(乱序输出)
--hello		Hello lua
--world		World

4. Lua 语言基础之数组

数组跟表一样也是用 { } 来代表,不过声明内部元素的时候不需要提供键,它会自动从 1 开始递增式为元素配置键。

arr = {1, 2, "Hello"}

-- 用 for 遍历数组内键值对
for key, var in pairs(arr) do
	print(key, var)
end

-- 输出如下
--1		1
--2		2
--3		Hello

插入元素

我们可以通过 for 为表添加元素,这时候要用到 Lua 提供的一个 API:table.insert()

arr1 = {}

for var = 1, 3 do
	table.insert(arr1, 1, var)	-- 3个形参按顺序分别是:表,插入位置,值
end

for key, var in pairs(arr1) do
	print(key, var)
end

-- 输出如下
--1		3
--2		2
--3		1

我们可以从上面的输出结果看出来,固定往位置 1 分别插入 1、2、3,原来处于位置 1 的值就会被往后推,最后就呈一个倒序的样子。

Lua 官网的 Document 里可以找到其 API 文档(此处为 5.4 版本),方便我们查阅 Lua 提供的方法的作用。其 API 基本就是对 C 语言 API 的一个映射。

下图截取自官方的 API 解析:
在这里插入图片描述

移除元素

我们可以通过 table.remove() 来移除表内的元素,并且这个方法会返回被移除的元素的值。

arr2 = {1, 2, 3, 4}

local rm = table.remove(arr2, 2)	-- 移除第 2 个元素

for key, var in pairs(arr2) do
	print(key, var)
end

print(rm)

-- 输出如下
--1		1
--2		3
--3		4
--2

获取表的长度

在 lua 5.2 及之前的版本,我们还可以通过 table.maxn() 来获取表的长度。如果是 lua 5.3 及以上的版本,我们可以用 # 来获取表的长度。

print(table.maxn(arr1))		-- 输出 3(仅适用于 lua 5.2 及以下版本)

print(#arr1)	-- 输出 3(仅适用于 lua 5.3 及以上版本)

全局表

在 Lua 里,所有的全局变量都被放在一个名为 _G 的全局表里。

a = 1
print(_G["a"])		-- 输出 1	

并且实际上 table.insert() 里的 table 也是一个全局变量,其类型是一个表;insert 就是它的一个键,其值是一个方法。

5. Lua 语言面向对象之复制表的方式面向对象

在表里面声明方法的写法如下:

People = {}

-- 声明方法的方式一
People.sayHi = function()
	print("People say hi")
end

-- 声明方法的方式二
function People.sayHello()
	print("People say hello")
end

此时我们可以发现表也可以当作是一个类,因为它既可以存储变量,又可以存储方法,所以表在 Lua 里是一个比较万金油的角色。

通过复制 People 类来创建它的实例:

-- 复制表内元素,返回这个复制表
function clone(tab)
	local ins = {}
	for key, var in pairs(tab) do
		ins[key] = var
	end
	return ins
end

-- 相当于创建实例
local p = clone(People)
p.sayHi()	-- 输出 People say Hi

我们还可以为类添加一个构造方法:

-- 修改一下 sayHi()
People.sayHi = function(self)
	print("People say hi:"..self.name)	-- ".." 是字符串连接符号
end

-- People 的构造方法
People.new = function(name)
	local self = clone(People)
	self.name = name

	return self
end

local p = People.new("ZhangSan")
p.sayHi(p)	-- 输出 People say hi:ZhangSan
-- 另一种调用方式
p:sayHi()	-- 使用 ":" 调用,输出同上

通过 : 调用方法,其实就是隐式地把表自己当作第一个实参传递,即 tab:func(param) 相当于 tab.func(tab, param)

那么反过来,通过 : 来定义方法,实际上隐藏了一个形参的声明,这个形参会截获调用函数时的第一个实参并把它赋值给self。

此处结论截取自其他博主的文章:《Lua函数的调用(:和.的调用区别)》

实现继承和重写父类方法

我们还可以通过复制表的内容来实现类的继承,并且可以重写父类方法。

-- 复制表的内容
function copy(dist, tab)
	for key, var in pairs(tab) do
		dist[key] = var
	end
end

-- Man 继承 People
Man = {}
Man.new = function(name)
	local self = People.new(name)
	copy(self, Man)		-- 将 Man 原本的内容也复制到 self 内
	return self
end

-- 重写父类 People 的 sayHello() 方法
Man.sayHello = function()
	print("Man say hello")
end

local m = Man.new("Lisi")
m:sayHello()	-- 输出 Man say hello
m:sayHi()		-- 输出 People say hi:Lisi

6. Lua语言面向对象之函数闭包的方式面向对象

我们可以专门声明一个返回表的方法,其中通过本地声明一个表,然后对其进行初始化操作以及方法定义的操作,这样我们就可以通过这个方法来获得一个类的实例。

function People(name)
	local self = {}

	local function init()
		self.name = name
	end

	self.sayHi = function()
		print("Hi "..self.name)
	end

	init()
	return self
end

local p = People("ZhangSan")
p:sayHi()	-- 输出 Hi ZhangSan

实现继承和重写父类方法

操作比较好理解,示例如下:

function Man(name)
	local self = People(name)

	self.sayHello = function()
		print("Hello "..self.name)
	end

	return self
end

local m = Man("Lisi")
m:sayHi()	-- 输出 Hi Lisi

额外补充

字符串补充

Lua 提供的 string.char() 可以将 Ascii 码值转换成字符串;string.byte() 可以直接将字符串里的指定位字符转换为十进制数值。

s = string.char(0x30, 0x31, 0x32, 0x33)
print(s)		-- 输出 0123
n = string.byte(s, 2)
print(n)		-- 输出 49(Ascii 表里,十进制 49 对应的是字符 '1')

在 C 语言里,字符串的 ‘0’ 代表着结束;但是在 Lua 里字符 ‘0’ 也可以被存储。这个特性可以用于安全地存储二进制流之类的数据。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SwiftUI 框架有哪些主要优势

SwiftUI是苹果公司在2019年推出的一种用于构建用户界面的框架&#xff0c;它使用Swift语言编写&#xff0c;并且与iOS、iPadOS、macOS、watchOS和tvOS等平台兼容。下面简单的看下有哪些主要的优势。 声明式的界面描述 使用声明式编程风格&#xff0c;通过简洁的代码描述用户界…

SSL证书影响网站搜索结果吗?

SSL&#xff08;Secure Sockets Layer&#xff09;证书作为保障网站信息安全的重要工具&#xff0c;其对于网站的搜索引擎优化&#xff08;SEO&#xff09;以及搜索结果的表现产生了深远影响。本文将深入探讨SSL证书如何作用于搜索结果&#xff0c;并分析它为何成为现代网络营销…

图片批量建码怎么用?每张图片快速生成二维码

当我们需要给每个人分别下发对应的个人证件类图片信息&#xff0c;比如制作工牌、荣誉展示或者负责人信息展示时&#xff0c;现在都开始使用二维码的方法来展示员工信息。那么如何快速将每个人员的信息图片分别制作成二维码图片呢&#xff0c;最简单的方法就是使用图片批量建码…

【备战蓝桥杯】快来学吧~ 图论巩固,Delia的生物考试

蓝桥杯备赛 | 洛谷做题打卡day12 文章目录 蓝桥杯备赛 | 洛谷做题打卡day12最大食物链计数题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示题解代码总的思路&#xff1a;拓扑排序 我的一些话 最大食物链计数 题目背景 你知道食物链吗&#xff1f;Delia 生…

Qt/C++中英输入法/嵌入式输入法/小数字面板/简繁切换/特殊字符/支持Qt456

一、前言 在嵌入式板子上由于没有系统层面的输入法支持&#xff0c;所以都绕不开一个问题&#xff0c;那就是在需要输入的UI软件中&#xff0c;必须提供一个输入法来进行输入&#xff0c;大概从Qt5.7开始官方提供了输入法的源码&#xff0c;作为插件的形式加入到Qt中&#xff…

unity 编辑器开发一些记录(遇到了更新)

1、封装Toggle组件 在用toggle等会状态改变的组件时&#xff0c;通过select GUILayout.Toggle(select, text, options)通常是这样做&#xff0c;但是往往有些复杂编辑器需求&#xff0c;当select变化时需要进行复杂的计算&#xff0c;所以不希望每帧去计算select应该的信息。…

Java找二叉树的公共祖先

描述&#xff1a; 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节…

目标检测数据集 - 跌倒检测数据集下载「包含VOC、COCO、YOLO三种格式」

数据集介绍&#xff1a;跌倒检测数据集&#xff0c;真实场景高质量图片数据&#xff0c;涉及场景丰富&#xff0c;比如交通事故跌倒、打架跌倒、运动跌倒、楼梯跌倒、生病跌倒、遮挡行人跌倒、严重遮挡行人跌倒数据&#xff1b;适用实际项目应用&#xff1a;公共场所监控或室内…

李沐《动手学深度学习》多层感知机 深度学习相关概念

系列文章 李沐《动手学深度学习》预备知识 张量操作及数据处理 李沐《动手学深度学习》预备知识 线性代数及微积分 李沐《动手学深度学习》线性神经网络 线性回归 李沐《动手学深度学习》线性神经网络 softmax回归 李沐《动手学深度学习》多层感知机 模型概念和代码实现 目录 …

Three.js 学习笔记之模型(学习中1.20更新) | 组 - 模型 - 几何体 - 材质

文章目录 模型 几何体 材质层级模型组- THREE.Group递归遍历模型树结构object3D.traverse() 模型点模型Points - 用于显示点线模型Line | LineLoop | LineSegments网格模型mesh - 三角形网格模型独有的属性与方法 几何体BufferGeometry缓冲类型几何体BufferGeometry - 基类创…

位运算的奇技淫巧

常见位运算总结&#xff1a; 1、基础位运算 左移<<运算 将二进制数向左移位操作&#xff0c;高位溢出则丢弃&#xff0c;低位补0。 右移>>运算 右移位运算中&#xff0c;无符号数和有符号数的运算并不相同。对于无符号数&#xff0c;右移之后高位补0&#xff…

SpringCloud Aliba-Sentinel【中篇】-从入门到学废【5】

&#x1f3b5;歌词分享&#x1f3b5; 岁月在墙上剥落看见小时候。 ——《东风破》 目录 &#x1f953;1.流控规则 &#x1f32d;2. 熔断规则 &#x1f9c8;3.热点规则 &#x1f9c2;4.系统规则 1.流控规则 1.资源名&#xff1a;唯一名称&#xff0c;默认请求路径 2.针对来…

【开源】基于JAVA语言的教学资源共享平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课程资源模块2.4 课程作业模块2.5 课程评价模块 三、系统设计3.1 用例设计3.2 类图设计3.3 数据库设计3.3.1 课程档案表3.3.2 课程资源表3.3.3 课程作业表3.3.4 课程评价表 四、系统展…

[AI]文心一言出圈的同时,NLP处理下的ChatGPT-4.5最新资讯

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言4.5key价格泄漏ChatGPT4.0使用地址ChatGPT正确打开方式最新功能语音助手存档…

SpringBoot项目中简单使用虚拟机Redis

目录 步骤大致如下&#xff1a; 一.在pom文件中加入redis依赖 二.在虚拟机上打开我们下载好的Redis。开启服务器端并获取虚拟机ip地址 三.在项目配置。 四&#xff1a;使用redis 测试 redis是一个以键值对存储的NoSQL。被数百万开发人员用作缓存、矢量数据库、文档数据库、…

beego项目部署与热更新

1.开发自己的第一个项目 这里我引用的是在线聊天室&#xff0c;参考源码是https://github.com/beego/samples/tree/master/WebIM 在源码的基础上重新开发&#xff0c;整理项目发布到了liu289747235/WebIM 推荐下载源码&#xff1a;https://gitee.com/myselfyou/web-im 在线…

kafka参数配置参考和优化建议 —— 筑梦之路

对于Kafka的优化&#xff0c;可以从以下几个方面进行思考和优化&#xff1a; 硬件优化&#xff1a;使用高性能的硬件设备&#xff0c;包括高速磁盘、大内存和高性能网络设备&#xff0c;以提高Kafka集群的整体性能。 配置优化&#xff1a;调整Kafka的配置参数&#xff0c;包括…

go语言(七)----slice的声明方式

1、声明方式一 //声明一个slice1是一个切片&#xff0c;但是并没有给slice分配空间var slice1 []intslice1 make([]int,3)2、声明方式二 声明一个slice切片&#xff0c;同时给slice分配空间&#xff0c;3个空间&#xff0c;初始化值是0var slice1 []int make([]int,3)3、声…

Docker:6种网络配置详解浅介

在Docker中&#xff0c;网络配置是一个重要的主题&#xff0c;因为容器需要与其他容器或外部网络进行通信。Docker提供了多种网络模式和配置选项&#xff0c;以便在不同的场景下满足用户的需求。 本文介绍这些网络模式的区别以及配置&#xff0c;相信看完以后你能够掌握Docker网…

基于springboot+vue养老院管理系统

摘要 这是一个基于Spring Boot 和 Vue.js 的养老院管理系统的项目。该系统旨在提供一套全面的解决方案&#xff0c;以简化养老院的日常管理任务&#xff0c;包括居民信息管理、员工调度、医疗服务追踪、财务管理等。通过结合后端的Spring Boot框架和前端的Vue.js框架&#xff0…