【Lua学习笔记】Lua进阶——Table(2)

news2024/11/28 19:31:55

在这里插入图片描述

文章目录

  • Table的一万种用法
    • 二维数组
    • 类和结构体
    • Table操作
      • insert & remove
      • sort
      • concat

接上文【Lua学习笔记】Lua进阶——Table,迭代器


Table的一万种用法

二维数组

a = {
    { 1, 2, 3 },
    { 4, 5, 6 },
}
print(#a) -->2
for i=1,#a do
    b = a[i]
    for j=1,#b do
        print(b[j])
    end
end
应该不用解释吧?

类和结构体

Lua是面向过程的,所以想要实现面向对象只能在形式上模拟。
那么面向对象要实现什么?继承封装多态,这些暂且不谈,首先一个类模块应当需要成员变量和成员方法。

car = {
    color = "red",
    size = "big",
    StartEngine = function()
        print("汽车,启动!")
    end,
}
car.StartEngine();
--在table外声明方法
car.StopEngine = function()
    print("停车")
end
car.StopEngine();
--另一种声明方式
function car.Speaker()
    print("嘟嘟嘟")
end
car.Speaker()
输出:
汽车,启动!
停车
嘟嘟嘟

上述代码确实看起来很像类,但是应当记住它是个table,别真的把它当作面向对象了,例如下面:

car = {
    color = "red",
    size = "big",
    StartEngine = function()
        print(color)
    end,
}
car.StartEngine();
输出
nil

car = {
    color = "red",
    size = "big",
    StartEngine = function()
        print(car.color)
    end,
}
car.StartEngine();
输出
red

很简单,如果直接print(color),那么color则是我们新定义的一个全局变量,它没有赋值自然是nil。
而想要打出red,就需要print(car.color),因为我们要打印的不是color,而是car这个table中的一个元素!

car = {
    color = "red",
    size = "big",
    StartEngine = function()
        print(self.color)
    end,
    PrintColor = function (t)
        print(t.color)
    end
}
car.PrintColor(car);
car:PrintColor();
输出:
red
red

lua提供了一个语法糖,当我们用冒号调用方法时,会把调用者作为第一个参数传入方法中

function car:PrintSize()  --相当于function car.PrintSize(car)
    print(self.size)
end
car.PrintSize(car);
car:PrintSize()
car:PrintSize(car)
输出:
big
big
big

冒号主要就是为了在函数调用时使用self关键字,self不同与this,它代表的应当是这个冒号传入的参数。除了提供便利性之外,冒号还会为我们节省一条指令。有种脱裤子放屁的美。


Table操作

insert & remove

t1 = {
    { age = 1, name = "a" },
    { age = 2, name = "b" },
}
t2 = { age = 3, name = "c" } --注意t2是一维的

for i = 1, #t1 do
    b = t1[i]
    print(b)
end
print("插入后")
table.insert(t1,t2)
for i = 1, #t1 do
    b = t1[i]
    print(b)
end
print(t1[1].name)
print(t1[2].name)
print(t1[3].name)

table: 00A2A580
table: 00A2A4B8
插入后
table: 00A2A580
table: 00A2A4B8
table: 00A2A5D0
a
b
c

执行insert后,我们观察地址不难发现,新数据被插入到尾部了,同样的,执行table.remove方法也会移除最后一个索引的元素。

table.insert(t1,2,t2)
for i = 1, #t1 do
    b = t1[i]
    print(b)
end
print(t1[1].name)
print(t1[2].name)
print(t1[3].name)

a
c
b

table.remove(t1,2,t2)
for i = 1, #t1 do
    b = t1[i]
    print(b)
end
print(t1[1].name)
print(t1[2].name)
print(t1[3].name) --报错
a
b

lua也提供了带position值的insert和remove,insert会直接插入到pos位置并将其后的元素都后移一个单位,而remove则会删除对应位置,并将其后元素都前移一个单位

sort

table.sort排序用法

t = { 2, 5, 5, 3, 6 }
table.sort(t)
for index, value in ipairs(t) do
    print(value)
end
print("--------")
table.sort(t, function(a, b)
    if a>b then
        return true
    end
end)
for index, value in ipairs(t) do
    print(value)
end

输出:
2
3
5
5
6
--------
6
5
5
3
2

知道升序和降序用法即可,默认升序,使用a>b reutrn true可以修改为降序猜想排序function与冒泡排序有关

concat

t = { 5, 5, 2, 3, 6 }
str = table.concat(t,",")
print(str)

5,5,2,3,6

str = table.concat(t,",",2,5)
print(str)

5,2,3,6

使用table.concat方法,其返回值是字符串,所以我们拼接时只能用number和string类型的,此外别忘了需要把返回值赋值来接收最后处理的结果

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

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

相关文章

opencv-25 图像几何变换04- 透视 cv2.warpPerspective()

什么是透视? 透视是一种几何学概念,用于描述在三维空间中观察物体时,由于视角的不同而产生的变形效果。在现实世界中,当我们从不同的角度或位置观察物体时,它们会呈现出不同的形状和大小。这种现象被称为透视效果。 透…

web-文件上传和upload-labs靶场通关

目录 前端过滤 uploads-lab-1: 后端验证 upload-labs-2:mime验证 upload-labs-3:黑名单绕过 upload-labs-4:黑名单绕过-.htaccess(这里得用旧版的phpstudy,新版的不行) upload-labs-5:后缀名绕过 upload-labs-…

探索南美专线:开启您的国际贸易之旅

​作为一个国际贸易从业者,您可能已经听说过南美专线。南美洲作为一个充满潜力的市场,吸引着越来越多的企业前来探索商机。南美专线是连接亚洲和南美洲的重要贸易通道,它为企业提供了便捷、高效的物流运输服务,助力您开拓南美市场…

Pycharm工具Python开发自动添加注释(详细)

方法自动添加参数注释 定义了一个函数,在函数下面敲入了三个双引号后,enter回车并没有自动出现注释,如图: 解决办法 Pycharm中依次打开File —> Settings —> Tools —> Python Integrated Tools,如图&…

android 如何分析应用的内存(十二)

android 如何分析应用的内存(十二) 上一篇介绍了ASan,这次介绍ASan的加强版HWASan HWASan的使用 从NDK r21和Android 10 开始,Android支持HWAsan。HWAsan仅仅支持arm64架构的设备。 系统级准备 HWASan需要系统的支持&#xf…

ZLMediaKit+wvp-GB28181-pro 安装文档

文章目录 前言1. 安装zlm1.1 镜像说明1.2 docker安装1.2.1 docker安装命令1.2.2 docker-compose安装 1.3. zlm配置和日志重点说明 2. 安装wvp2.1 目录结构说明2.1.1 导入idea2.1.2 sql文件夹自带初始化库脚本2.1.3 进入web_src 编译静态资源2.1.4 修改resources配置 2.2 wvp 启…

javafx实现拖拽复制功能

效果 代码 package cn.juhe.zjsb.test;import javafx.application.Application; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.SnapshotParameters; import javafx.scene.control.Label; import javafx.scene.control.TextField; impor…

java语言agent探针技术使用

打包插件 使用了三款 spring-boot-maven-plugin maven-jar-plugin maven-assembly-plugin(可用或不可用),用于打zip包 web打包插件 spring-boot-maven-plugin maven-assembly-plugin 打包后生成的MANIFEST.MF文件 Manifest-Version:…

【LeetCode】79.单词搜索

题目 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或…

可可口乐题解

样例输入&#xff1a; cococala样例输出&#xff1a; 1思路分析&#xff1a; 这道题的 n n n是 8 8 8&#xff0c;所以可以无脑 d f s dfs dfs&#xff0c;那就变得非常简单了。 代码 (注释详解) &#xff1a; #include<iostream> using namespace std; char t[10]{…

flask中redirect、url_for、endpoint介绍

flask中redirect、url_for、endpoint介绍 redirect 在 Flask 中&#xff0c;redirect() 是一个非常有用的函数&#xff0c;可以使服务器发送一个HTTP响应&#xff0c;指示客户端&#xff08;通常是浏览器&#xff09;自动导航到新的 URL。基本上&#xff0c;它是用来重定向用…

我国数据出境制度实践进展

随着互联网在全球的普及和数字经济在全球的发展&#xff0c;数据跨境流动已经成为各个国家和地区重点关注的议题。数据的跨境流动同时具备个人权益保护、企业合规经营和各国监管合作与博弈三个维度&#xff0c;各国和地区近年来对个人信息的跨境流动高度重视&#xff0c;相继出…

《吐血整理》保姆级系列教程-玩转Fiddler抓包教程(3)-再识Fiddler让你感性认识一下

1.简介 上一篇通过宏哥的介绍想必各位小伙伴或者童鞋们对Fiddler已经有了一个理性地认识&#xff0c;今天宏哥在从Fiddler的外貌介绍和分享一下&#xff0c;让小伙伴们或者童鞋们再对Fiddler有一个感性的认识&#xff0c;今天主要是对Fiddler的界面进行一个详细的介绍。 2.Fi…

饮用水、地下水除砷的方法——砷吸附树脂

砷&#xff08;As&#xff09;为非人体必需元素&#xff0c;既不溶解于水又不溶解于酸&#xff0c;在自然界有三价无机态 As(III)、五价无机态 As(V)以及有机砷MMA(甲基胂酸)、DMA(二甲基胂酸)、TMA(三甲基胂酸)等。 砷在水体中主要以三价和五价的无机酸形式存在&#xff0c;三…

Vue 渲染流程详解

在 Vue 里渲染一块内容&#xff0c;会有以下步骤及流程&#xff1a; 第一步&#xff0c;解析语法&#xff0c;生成AST 第二步&#xff0c;根据AST结果&#xff0c;完成data数据初始化 第三步&#xff0c;根据AST结果和DATA数据绑定情况&#xff0c;生成虚拟DOM 第四步&…

Citespace、vosviewer:揭秘最火热的学术文献绘图神器!

目录 专题一 文献计量学方法与应用简介 专题二 主题确定、检索与数据采集 专题三 VOSviewer可视化绘图精讲 专题四 Citespace可视化绘图精讲 专题五 R语言文献计量学绘图分析 专题六 论文写作 专题七 论文投稿 文献计量学是指用数学和统计学的方法&#xff0c;定量地分析…

【C++从0到王者】第十二站:vector基本使用

文章目录 一、vector基本介绍二、vector的基本使用三、vector\<char> 和string的区别四、vector接口介绍1.vector的模板参数2.构造函数3.迭代器4.size和max_size5.resize和reserve6.operator[]和at7.front和back8.data9.push_back和pop_back10.insert和erase11.assign12.…

C#月数计算器(主要用于社保、医保缴费月数计算)

1、为什么做这个&#xff1f; 工作中&#xff0c;经常需要计算参保人社保、医保缴费月数&#xff0c;之前都是在Excel中写一个DATEDIF公式&#xff0c;修改单元格中的日期&#xff0c;计算间隔的月数&#xff0c;公式如下&#xff1a; DATEDIF(起始日期, 终止日期, 返回类型) …

QT第二讲

思维导图 完善登录框&#xff0c;当登录成功时&#xff0c;关闭登录界面&#xff0c;跳转到新的界面中 loginscuueed.h #ifndef LOGINSUCCEED_H #define LOGINSUCCEED_H#include <QWidget>namespace Ui { class loginSucceed; }class loginSucceed : public QWidget {…

android数据的储存、文件的储存、SharedPreferences储存、SQLite的基本用法

一、文件的储存 1、将数据储存到文件中 Context类中提供了openfileOutput()方法&#xff0c;用来获取一个文件流&#xff0c;这个方法接收两个参数&#xff0c;第一个参数是文件名&#xff0c;在文件创建的时候使用的就是这个名称&#xff0c;注意这里指定的文件名不可以包含…