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")
endsayHello()	-- 调用,输出 Hello Lua

使用 if - else

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

function max(a, b)-- if 语句的运用if a > b thenreturn aelsereturn bend
endprint(max(2, 3))	-- 输出 3
  • 如果中间想继续判断就用 elseif {表达式} then

使用 for

使用 for 循环:

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

使用 while

使用 for 循环:

-- 输出 1 到 100
local var = 1
while var < 101 doprint(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) doprint(key, var)	
end-- 输出如下(乱序输出)
--hello		Hello lua
--world		World

4. Lua 语言基础之数组

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

arr = {1, 2, "Hello"}-- 用 for 遍历数组内键值对
for key, var in pairs(arr) doprint(key, var)
end-- 输出如下
--1		1
--2		2
--3		Hello

插入元素

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

arr1 = {}for var = 1, 3 dotable.insert(arr1, 1, var)	-- 3个形参按顺序分别是:表,插入位置,值
endfor key, var in pairs(arr1) doprint(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) doprint(key, var)
endprint(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) doins[key] = varendreturn 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 = namereturn self
endlocal 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) dodist[key] = varend
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")
endlocal 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 = nameendself.sayHi = function()print("Hi "..self.name)endinit()return self
endlocal p = People("ZhangSan")
p:sayHi()	-- 输出 Hi ZhangSan

实现继承和重写父类方法

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

function Man(name)local self = People(name)self.sayHello = function()print("Hello "..self.name)endreturn self
endlocal 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’ 也可以被存储。这个特性可以用于安全地存储二进制流之类的数据。

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

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

相关文章

Prompt高级技巧:Few-Shots、COT、SC、TOT、Step-Back

CRISPE框架 如图所示。所谓CRISPE框架&#xff0c;指的是&#xff1a; CR&#xff1a;Capacity and Role&#xff08;能力与角色&#xff09;。你希望 ChatGPT 扮演怎样的角色。I&#xff1a;Insight&#xff08;洞察&#xff09;&#xff0c;背景信息和上下文。S:&#xff08…

递归、搜索与回溯算法(专题二:深搜)

往期文章&#xff08;希望小伙伴们在看这篇文章之前&#xff0c;看一下往期文章&#xff09; &#xff08;1&#xff09;递归、搜索与回溯算法&#xff08;专题零&#xff1a;解释回溯算法中涉及到的名词&#xff09;【回溯算法入门必看】-CSDN博客 &#xff08;2&#xff09…

实验七 RMAN恢复管理器

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

利用appium自动控制移动设备并提取数据

安装appium-python-client模块并启动已安装好的环境 安装appium-python-client模块 在window的虚拟环境下执行pip install appium-python-client 启动夜神模拟器&#xff0c;进入夜神模拟器所在的安装路径的bin目录下&#xff0c;进入cmd终端&#xff0c;使用adb命令建立adb…

Kubernetes (十五) 认证与授权

一. 访问控制 二.UserAccount与serviceaccount区别 将认证信息添加…

关闭Windows自动更新的6种方法

关闭Windows自动更新的6种方法&#xff01; 方法一&#xff1a;通过Windows设置关闭Windows自动更新 步骤1. 按WinI打开Windows设置页面。步骤2. 单击“更新和安全”>“Windows更新”&#xff0c;然后在右侧详情页中选择“暂停更新7天”选项即可在此后7天内关闭Windows更新…

【Linux】相关背景及环境搭建

前言&#xff1a; 认识 Linux, 了解 Linux 的相关背景&#xff0c;学会如何使用云服务器&#xff0c;掌握使用远程终端工具 xshell 登陆 Linux 服务器 文章目录 一、Linux介绍1.1 关于UNIX1.2 Linux的诞生及发展历程1.3 Linux开源1.4 Linux在各个行业的现状1.5 发行版本 二、Li…

LeetCode 热题 100 | 双指针(上)

目录 1 283. 移动零 2 11. 盛最多水的容器 3 15. 三数之和 菜鸟做题第一周&#xff0c;语言是 C 1 283. 移动零 解题思路&#xff1a; 两个指针一前一后遍历数组前者永远指向 0&#xff0c;后者永远在寻找非 0 数的路上后者找到一个非 0 数就和前者进行一个数值交换 …

x-cmd pkg | jieba - 中文结巴分词工具

目录 简介首次用户功能特点竞品分析进一步阅读 简介 结巴中文分词&#xff08;jieba&#xff09;是一款在 Python 环境下使用的开源中文文本分词工具。它支持多种分词模式&#xff0c;包括精确模式、全模式和搜索引擎模式&#xff0c;同时支持繁体分词和自定义词典。因其易用性…

[202401C]巨人之力的题解

原题描述&#xff1a; 时间限制: 1000ms 空间限制: 262144kb 题目描述 两千多年以前&#xff0c;身为艾尔迪亚人的尤弥尔意外获得巨人之力&#xff0c;并且创造了九大巨人&#xff0c;其无以匹敌的力量使得整个世界都陷入了无尽的战乱纷争&#xff0c;艾尔迪亚之外的人类过…

docker-compose直接官网二进制文件安装(linux)

试了很多种方法&#xff0c;国内镜像库安装&#xff0c;会报语法错误 直接用github官网&#xff0c;命令安装下载太慢&#xff0c;还不如魔法下载 官网链接docker-compose-linux-x86_64https://github.com/docker/compose/releases/download/v2.24.1/docker-compose-linux-x8…

温度采样【通道选通】S9KEAZ128的PTA2和PTA3引脚无法拉高

1、问题记录&#xff1a;由18串温度采样修改成32串温度采样&#xff0c;增加一路adc采样&#xff0c;通过cd4051控制通道选通&#xff0c;代码中增加了相应的代码&#xff0c;发现增加的最后8路温度不能够控制&#xff0c;以24串为例&#xff0c;给温度传感器增加温度&#xff…

pytorch(四)、完整小网络的搭建和sequential的使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言搭建小网络和sequential的使用一、 第一种形式如下&#xff1a;二、第二种方式&#xff0c;使用sequential 前言 至此&#xff0c;神经网络的基础部分就基本结…

解决Spring Boot跨域问题(配置JAVA类)

什么是跨域问题 跨域问题指的是不同端口之间&#xff0c;使用 ajax 无法相互调用的问题。跨域问题本质是浏览器的一种保护机制&#xff0c;它是为了保证用户的安全&#xff0c;防止恶意网站窃取数据。 比如前端用的端口号为8081&#xff0c;后端用的端口号为8080&#xff0c;后…

C语言从入门到实战——编译和链接

编译和链接 前言一、 翻译环境和运行环境二、 翻译环境2.1 预处理&#xff08;预编译&#xff09;2.2 编译2.2.1 词法分析2.2.2 语法分析2.2.3 语义分析 2.3 汇编2.4 链接 三、 运行环境 前言 在C语言中&#xff0c;编译和链接是将源代码转换为可执行文件的两个主要步骤。 编…

MacBookPro怎么数据恢复? mac电脑数据恢复?

使用电脑的用户都知道&#xff0c;被删除的文件一般都会经过回收站&#xff0c;想要恢复它直接点击“还原”就可以恢复到原始位置。mac电脑同理也是这样&#xff0c;但是“回收站”在mac电脑显示为“废纸篓”。 如果电脑回收站&#xff0c;或者是废纸篓里面的数据被清空了&…

App 测试工具大全,收藏这篇就够了

随着移动互联网的高速发展&#xff0c;App应用非常火&#xff0c;测试工程师也会接触到各种app应用。除了人工测试之外&#xff0c;也可以通过一些测试工具来提高我们的测试效率&#xff0c;以下对于我用过或听过的app测试工具做了一个统一整理&#xff0c;欢迎补充。 一、APP自…

【51单片机Keil+Proteus8.9+ADC0804】ADC实验 模拟转数字实验

一、实验名称 ADC实验 模拟转数字实验 二、设计思路 电路设计 1.选用AT89C51单片机作为电路核心单元&#xff0c;外接8位单通道AD转换器ADC0804芯片和LM016L显示器以及滑动变阻器等其它常用元器件构成电路。 2.将ADC0804芯片的控制引脚RD,WR,INTR接到AT89C51芯片对应引脚&…

Spring Boot程序的打包与运行:构建高效部署流程

引言 在现代应用开发中&#xff0c;高效的打包和部署流程对于项目的开发、测试和上线至关重要。Spring Boot作为一种快速开发框架&#xff0c;提供了方便的打包工具和内嵌式的Web服务器&#xff0c;使得打包和运行变得更加简单。本文将研究在Spring Boot应用中如何进行打包&am…

外包干了5个月,技术退步明显...

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…