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.rhkb.cn/news/241219.html

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

相关文章

MySQL 删除ibdata1时怎么恢复

标题&#xff1a;MySQL InnoDB数据恢复&#xff0c;丢失ibdata1时怎么安全恢复 废话在前&#xff1a; 恭喜你&#xff0c;当你看到这篇文章的时候&#xff0c;说明有可能 你心里已经有一万匹&#x1f40e;在奔腾了。千万不要乱删除ibdata1&#xff0c;有些博客无脑抓取、复制…

VUE 中的 v-for 和 v-if 是否可以共存

VUE 中的 v-for 和 v-if 是否可以共存 前言1、面试经2、正确回答3、总结总结&#xff1a; 前言 要成功&#xff0c;先发疯&#xff0c;头脑简单往前冲&#xff01; 三金四银&#xff0c;金九银十&#xff0c;多学知识&#xff0c;也不能埋头苦干&#xff0c;要成功&#xff0c…

【音视频原理】图像相关概念 ② ( 帧率 | 常见帧率标准 | 码率 | 码率单位 )

文章目录 一、帧率1、帧率简介2、常见帧率标准3、帧率 刷新率 二、码率1、码率简介2、码率单位 一、帧率 1、帧率简介 帧率 Frame Rate , 帧 指的是 是 画面帧 , 帧率 是 画面帧 的 速率 ; 帧率 的 单位是 FPS , Frames Per Second , 是 每秒钟 的 画面帧 个数 ; 帧率 是 动画…

米粒图像预处理-图像背景均匀化

案例背景 食品检测在国家粮食安全中拥有举足轻重的地位。随着经济全球化程度的深入&#xff0c;中国巨大的市场消费力将吸引越来越多的国际米类品牌的进入&#xff0c;国内粮食市场的竞争将会日趋激烈&#xff0c;人们越来越注重粮食的安全和品质问题&#xff0c;粮食质量检测…

SpringMVC下半篇之异常处理器及日期转换器

3.异常处理器 如果不加以异常处理&#xff0c;错误信息肯定会抛在浏览器页面上&#xff0c;这样很不友好&#xff0c;所以必须进行异常处理。 3.1.异常处理思路 系统的dao、service、controller出现都通过throws Exception向上抛出&#xff0c;最后由springmvc前端控制器交由…

自动驾驶中的坐标系

自动驾驶中的坐标系 自动驾驶中的坐标系 0.引言1.相机传感器坐标系2.激光雷达坐标系3.车体坐标系4.世界坐标系4.1.地理坐标系4.2.投影坐标系4.2.1.投影方式4.2.2.墨卡托(Mercator)投影4.2.3.高斯-克吕格(Gauss-Kruger)投影4.2.4.通用横轴墨卡托UTM&#xff08;UniversalTransve…

C-Lodop (Print)前端自定义打印控件

1.首先安装C-Lodop.exe软件&#xff0c;参考地址 Welcome to C-Lodop 2.软件下载地址 下载中心 - Lodop和C-Lodop官网主站 3.案列 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><script srchttp://19…

Python-基础篇-类与对象/面向对象程序设计

文章目录 思维导图是何物类定义类&#x1f4da; class类的成员&#x1f4da;类的继承性&#x1f4da;封装性&#x1f4da;多态性 对象面向对象&#x1f4da;创建对象&#x1f4da;销毁对象&#x1f4da; 类和对象关系必背必记专业英语学习角 思维导图 是何物 类 “类”是物以…

SqlAlchemy使用教程(四) MetaData 与 SQL Express Language 的使用

SqlAlchemy使用教程(一) 原理与环境搭建SqlAlchemy使用教程(二) 入门示例及编程步骤SqlAlchemy使用教程(三) CoreAPI访问与操作数据库详解SqlAlchemy使用教程(四) MetaData 与 SQL Express Language 的使用SqlAlchemy使用教程(五) ORM API 编程入门 四、Database MetaData 与 S…

WebRTC视频会议/视频客服系统EasyRTC进入会议室密码验证的开发与实现

基于WebRTC技术的EasyRTC视频会议系统&#xff0c;建设目标是让用户随时随地、快捷方便地进行视频会议&#xff0c;并根据行业需求有针对性地提供多样化、个性化功能&#xff0c;该系统是覆盖全球的实时音视频开发平台&#xff0c;支持一对一、一对多等视频通话&#xff0c;极大…

上门服务系统|上门服务小程序|上门服务系统的发展趋势

在现代社会&#xff0c;人们的生活节奏越来越快&#xff0c;对于更加便捷的服务需求也随之增加。正是基于这一背景&#xff0c;上门服务系统应运而生&#xff0c;并且迅速发展壮大。那么&#xff0c;上门服务系统的发展趋势又是怎样的呢&#xff1f; 首先&#xff0c;上门服务系…

Spring MVC学习之——自定义日期转化器

日期转换器 在数据库中的日期数据是date类型&#xff0c;而如何我们想在页面自己添加数据&#xff0c;一般是使用年-月-日的形式&#xff0c;这种形式不仅date类型接收不到&#xff0c;而且传来的是String类型&#xff0c;此时&#xff0c;我们就可以自定义日期转换器来接收数…

k8s的坑,从这里开始

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 以前刚接触k8s时踩了不少坑&#xff0c;比如这些&#xff1a; 问题1 1、在master节点使用kubectl命令时&#xff0c;报错&…

如何打造企业内部流程系统?

企业的发展过程中&#xff0c;要不断收集员工的建议&#xff0c;以改进自身的流程并增强自身的竞争力。 除此之外&#xff0c;企业也希望员工能积极为公司提出更多的创意和提案&#xff0c;共同加强企业的建设。 那么针对这类场景&#xff0c;我们应该如何在企业内部推动呢&a…

任意文件读取漏洞

一.任意文件读取概述 ​ 一些网站的需求&#xff0c;可能会提供文件查看与下载的功能。如果对用户查看或下载的文件没有限制或者限制绕过&#xff0c;就可以查看或下载任意文件这些文件可以是源代码文件&#xff0c;配置文件&#xff0c;敏感文件等等。 任意文件读取会造成&am…

redis数据安全(三)数据持久化 AOF

接上一篇RDB&#xff0c;本篇看下Redis数据持久化的第二种方式AOF。 目录 一、AOF原理 1、写入机制&#xff1a; 2、缓冲机制&#xff1a; 3、重写机制 &#xff1a; 4、运行流程 二、AOF文件配置 1、开启AOF&#xff1a; 2、自动触发AOF重写 3、重写规则&#xff1…

Unity Mirror VR联机开发 实战篇(二)

一、迁移示例中的联机物体 1、将MirrorExamplesVR工程中的部分文件夹复制到自己的工程中。 1、打开MirrorExamplesVR中的 SceneVR-Common场景。 2、将场景中没用的东西都删掉&#xff0c;只留下面这些&#xff0c;新建一个空物体XR Mirror&#xff0c;将所有剩下的物体拖成XR …

Spring Boot自动配置原理

1.SpringBootApplication注解 springboot是基于spring的新型的轻量级框架&#xff0c;最厉害的地方当属**自动配置。**那我们就可以根据启动流程和相关原理来看看&#xff0c;如何实现传奇的自动配置 SpringBootApplication//标注在某个类上&#xff0c;表示这个类是SpringBo…

Redis内部数据结构skiplist详解

我们将大体分成三个部分进行介绍&#xff1a; 介绍经典的skiplist数据结构&#xff0c;并进行简单的算法分析。这一部分的介绍&#xff0c;与Redis没有直接关系。我会尝试尽量使用通俗易懂的语言进行描述。 讨论Redis里的skiplist的具体实现。为了支持sorted set本身的一些要求…

15.云原生之k8s容灾与恢复实战

云原生专栏大纲 文章目录 Velero与etcd介绍Velero与etcd备份应用场景Velero与etcd在k8s备份上的区别 Velero备份恢复流程备份工作流程Velero备份时&#xff0c;若k8s集群发送变化&#xff0c;会发发生情况&#xff1f;Velero 备份pv&#xff0c;pv中数据变化&#xff0c;会发发…