Lua 快速入门 · 教程笔记

news2024/9/21 14:31:36

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’ 也可以被存储。这个特性可以用于安全地存储二进制流之类的数据。

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

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

相关文章

鸿蒙开发-UI-布局-线性布局

鸿蒙开发-序言 鸿蒙开发-工具 鸿蒙开发-初体验 鸿蒙开发-运行机制 鸿蒙开发-运行机制-Stage模型 鸿蒙开发-UI 鸿蒙开发-UI-组件 鸿蒙开发-UI-组件-状态管理 鸿蒙开发-UI-应用-状态管理 鸿蒙开发-UI-渲染控制 鸿蒙开发-UI-布局 文章目录 前言 一、基本概念 二、布局子元素 1.子元…

【数据结构与算法】1.时间复杂度和空间复杂度

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有限&#xff0c;欢迎各位大佬指点&…

Java设计模式-UML与设计原则(1)

大家好&#xff0c;我是馆长&#xff01;在正式讲解Java设计模式之前&#xff0c;馆长先整理了一些概要信息&#xff0c;方便大家了解和学习。了解这些技术和理论信息&#xff0c;可以为设计模式的讲解更加的透彻与易学。 简介 统一建模语言&#xff08;Unified Modeling Langu…

【react】创建react项目+项目结构

使用create-react-app快速搭建开发环境 create-react-app是一个快速创建React开发环境的工具&#xff0c;底层由Webpack构建&#xff0c;封装了配置细节 npx create-react-app react_hm执行命令后开始创建 创建好执行cd react_hm npm start 当看到webpack compiled successfu…

(超详细)7-YOLOV5改进-添加 CoTAttention注意力机制

1、在yolov5/models下面新建一个CoTAttention.py文件&#xff0c;在里面放入下面的代码 代码如下&#xff1a; import numpy as np import torch from torch import flatten, nn from torch.nn import init from torch.nn.modules.activation import ReLU from torch.nn.mod…

Redis最新版本搭建主从环境,Redis主从复制环境搭建

一般网站搭建都会使用Redis做缓存&#xff0c;当单台Redis承受不住压力时&#xff0c;会考虑搭建Redis主从。在没有业务的情况下&#xff0c;一般不会一下子上来就去搭建Redis无中心集群 Redis主从复制环境搭建&#xff0c;前面跟部署单台Redis一致&#xff0c;只不过后面是从R…

【C++入门】STL容器--vector底层数据结构剖析

目录 前言 1. vector的使用 vector的构造 vector迭代器 vector空间相关的接口 vector 功能型接口 find swap insert erase 2. vector内部数据结构剖析 reserve push_back和pop_back size、capacity、empty、operator[ ]&#xff1b; insert和erase resize swap 拷贝构造和…

acwing讲解篇之92. 递归实现指数型枚举

文章目录 题目描述题解思路题解代码 题目描述 题解思路 本题相当于二叉树的深度优先遍历&#xff0c;树的第i层是第i个数选或不选 我们记录当前递归的深度deep 然后用state进行状态压缩&#xff0c;state第i位是1表示选第i个数&#xff0c;第i位是0表示不选第i个数 进行dfs 如…

【面试突击】硬件级别可见性问题面试实战(上)

&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308; 欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复…

算法训练 day24 | 77. 组合

77. 组合 题目链接:组合 视频讲解:带你学透回溯算法-组合问题 回溯其实和递归是密不可分的&#xff0c;解决回溯问题标准解法也是根据三部曲来进行的。 1、递归函数的返回值和参数 对于本题&#xff0c;我们需要用一个数组保存单个满足条件的组合&#xff0c;还需要另一个结果数…

qt初入门5:字体设置和元对象系统的练习

空闲时间&#xff0c;参考课本demo&#xff0c;做一下练习。 字体的颜色主要用QPalette类&#xff0c;调色板的作用&#xff0c;控制着窗口部件的颜色和外观&#xff0c;包括背景色、前景色、文本颜色、边框颜色等。 字体的显示样式主要用Font类&#xff0c;用于管理字体。 元…

【想要安利给所有人的开发工具】最强工具ChatGPT——分享一些使用经验

目录 &#x1f525;个人使用ChatGPT的经验 &#x1f525;如何使用ChatGPT 方法一 方法二 &#x1f525;&#x1f525;提问技巧分享 1、英语翻译员 2、面试官 3、javascript 控制台 4、Excel表格 5、作曲家 6、辩手 7、小说家 8、诗人 9、数学老师 10、网络安全…

【第七在线】利用大数据与AI,智能商品计划的未来已来

随着科技的快速发展&#xff0c;大数据和人工智能(AI)已经成为各行各业变革的重要驱动力。在服装行业&#xff0c;这两大技术的结合正在深刻改变着传统的商品计划方式&#xff0c;引领着智能商品计划的未来。 一、大数据与AI在智能商品计划中的角色 大数据为智能商品计划提供了…

实用干货:最全的Loading动画合集网站!复制即用

大家好&#xff0c;我是大澈&#xff01; 本文约1000字&#xff0c;整篇阅读大约需要2分钟。 感谢关注微信公众号&#xff1a;“程序员大澈”&#xff0c;免费领取"面试礼包"一份&#xff0c;然后免费加入问答群&#xff0c;从此让解决问题的你不再孤单&#xff01…

心跳检测与服务剔除

社保中心的忧桑 今天社保中心来了一位钉子户&#xff0c;90多岁的王大爷又兴高采烈的来给自己快120岁的老父亲领社保了! 工作人员这一-想&#xff0c;好像哪里不对啊&#xff0c;这老父亲120岁的年纪都可以上吉尼斯世界纪录了&#xff0c;要不咱帮老爷子去申请一下?王大爷一听…

Java 实际开发中,实现微信小程序/微信公众号的微信注册登录

1.功能   实际开发中&#xff0c;实现微信小程序/微信公众号的微信注册登录 2.前置条件   这里只关注注册登录逻辑&#xff0c;所以前提是先对接好微信授权的相关接口。比如&#xff1a;      1. 获取微信公众号/小程序token接口      2. 获取微信公众号/小程序授…

Springboot常见报错及解决方案

1、多模块项目无法启动&#xff0c;报错Failed to execute goal on project*: Could not resolve dependencies for project 2、报错找不到符号&#xff08;在多moudle调用的时候&#xff0c;公共模块新增了东西的时候发生&#xff09; Rebuild项目

【实战】SpringBoot自定义 starter及使用

文章目录 前言技术积累SpringBoot starter简介starter的开发步骤 实战演示自定义starter的使用写在最后 前言 各位大佬在使用springboot或者springcloud的时候都会根据需求引入各种starter&#xff0c;比如gateway、feign、web、test等等的插件。当然&#xff0c;在实际的业务…

C语言从入门到实战——文件操作

文件操作 前言一、 为什么使用文件二、 什么是文件2.1 程序文件2.2 数据文件2.3 文件名 三、 二进制文件和文本文件四、 文件的打开和关闭4.1 流和标准流4.1.1 流4.1.2 标准流 4.2 文件指针4.3 文件的打开和关闭4.4 文件的路径 五、 文件的顺序读写5.1 顺序读写函数介绍fgetcfp…

pearcmd文件包含漏洞

1.什么是pearcmd.php pecl是PHP中用于管理扩展而使用的命令行工具&#xff0c;而pear是pecl依赖的类库。在7.3及以前&#xff0c;pecl/pear是默认安装的&#xff1b;在7.4及以后&#xff0c;需要我们在编译PHP的时候指定--with-pear才会安装 不过&#xff0c;在Docker任意版本…