C++系列十:其他-1. Lua
系列文章目录
Lua
- 系列文章目录
- 前言
- Lua介绍:
- 参考链接:
- 基本语法:
- 函数、迭代器
- table、userdata、模块
- 元素、元方法:
- 协程、文件读写
- 面向对象、垃圾回收
前言
我写这个博客的一个问题?(●’◡’●) 居然是 取名太难了。
其实都是摘抄,用vscode ,写了几行代码,写下聊表心意哈。
学习太累了,我要躺平……
Lua介绍:
脚本语言!
参考链接:
安装参考、
嗨客网、
菜鸟教程
C++调用lua
基本语法:
--1. 注释:
--单行注释
--[[多行注释多行注释
--]]
--2. 数据类型:
nil、boolean、number、string、function、userdata、thread、table
--3. nil删除全局变量的值:
a = 1024;print(a);a = nil;print(a)
--4. type判断变量是否为nil
a = 1024
if (type(a) == "nil")
thenprint("a is nil")
elseprint("a is not nil")
end
--5. 定义多个变量
name, age = "haicoder", 1024
--6. string("" 或 '')、块字符串([[ ]])
varname = "1024";password='123456'
varname = [[<body><a href="https://www.haicoder.net/">haicoder</a></body>
]]
--7.全局变量(默认),局部变量(local,表中的域(???):
a = 1024
function pi()pi = 3.14159local name = "haicoder" --局部变量
end
pi();print("a =", a, "pi =", pi, "name =", name)
--8...运算符,实现字符串连接、使用 # 实现获取字符串长度、三目运算符and 和 or
local str1 = "Hello";local str2 = " HaiCoder"
local ret = str1..str2;print(string.format("ret = %s", ret))
print(string.format("strl len = %d, str2 len = %d", #str1, #str2))
a = 100;b = 1024;local ret = a > b and a or b--只会在需要时才去操作第二个操作数
--9.模块:
module={};return module
package.path="E:\\C++\\LuaProject"..package.path;--搜索路径
local m = require("module")
--10.错误处理:
assert(type(a) == "number", "a is not a number")
assert(type(b) == "number", "b is not a number")
pcall 、debug--详细罗列
nil --只有值 nil 属于该类,表示一个无效值(在条件表达式中相当于 false)。
boolean --包含两个值:false 和 true。
number --表示双精度类型的实浮点数。(int float double )
string --字符串由一对双引号或单引号来表示。
function --由 C 或 Lua 编写的函数。
userdata --表示任意存储在变量中的 C 数据结构。
thread --表示执行的独立线路,用于执行协同程序。
table --Lua 中的表(table)其实是一个 “关联数组”(associative arrays),数组的索引可以是数字或者是字符串。在 Lua 里,table 的创建是通过 “构造表达式” 来完成,最简单构造表达式是 {},用来创建一个空表。
函数、迭代器
--迭代器:
for迭代器
array = {"Hello", "HaiCoder", "Lua"}
for k, v in ipairs(array)
doprint(string.format("Key = %d, Value = %s", k, v))
end
table、userdata、模块
--初始索引一般以 1 ;
--有新数据插入时长度会自动增长;
--保存数据可以是任何类型,包括 function 和 table。
--所有元素之间,总是用逗号 “,” 隔开
concat、insert、maxn、remove、sortmytable = {}
mytable[1] = "Lua";print("mytable[1] =", mytable[1])
mytable["name"] = "haicoder";print("mytable[name] =", mytable["name"])
mytable["name"] = "HaiCoder";print("mytable[name] =", mytable["name"])--userdata
int luaL_newmetatable(lua_State*L, const char *tname);
void luaL_getmetatable(lua_State *L,const char *tnaem);
void *luaL_checkudata(lua_State*L,int index,const char *tname);--模块
module={}
module.constant="this is constant"
function module.func1()io.write("this is a public function")
end
local function func2()io.write("this is private function")
end
function module.func3()func2()
end
return module
--调用
--package.path的路径
package.path="E:\\C++\\LuaProject"..package.path;
local m = require("module")
print(m.constant)
m.func3();
元素、元方法:
mytable = setmetatable({},{foo=2,zh="zhou"})
tty=getmetatable(mytable) -- 这回返回mymetatable
print(tty.zhouyi)--元方法:__index、__newindex、__add、__sub、__mul、__div、__mod、__unm、__concat、__eq、__lt、__le、__call、__tostring、
1. __index
mytable = setmetatable({key1 = "value1"}, {__index = function(mytable, key)if key == "key2" thenreturn "metatablevalue"elsereturn nilendend
})
print(string.format("key1 = %s, key2 = %s", mytable.key1, mytable.key2))
--简写:
mytable = setmetatable({key1 = "value1"}, { __index = { key2 = "metatablevalue" } })
print(mytable.key1,mytable.key2)2. __newindex
协程、文件读写
Lua 协同程序(coroutine)与线程比较类似:拥有独立的堆栈,独立的局部变量,独立的指令指针,同时又与其它协同程序共享全局变量和其它大部分东西。coroutine.create()、coroutine.resume()、coroutine.yield()、coroutine.status()、coroutine.wrap()、coroutine.running() 、coroutine.isyieldable()status():suspended、running、normal、deadcoco = coroutine.create(function (a,b)print("resume args:"..a..","..b)yreturn = coroutine.yield()print ("yreturn :"..yreturn)
end)
coroutine.resume(coco, 0, 1)
coroutine.resume(coco, 21)
--
#!/usr/bin/lua
print("haicoder(www.haicoder.net)\n")
coco2 = coroutine.wrap(function (a,b)print("resume args:"..a..","..b)yreturn = coroutine.yield()print ("yreturn :"..yreturn)
end)
print(type(coco2))
coco2(0,1)
coco2(21)
--
local newProductor
function productor()local i = 0while true doi = i + 1send(i) -- 将生产的物品发送给消费者end
end
function consumer()while true dolocal i = receive() -- 从生产者那里得到物品print(i)end
end
function receive()local status, value = coroutine.resume(newProductor)return value
end
function send(x)coroutine.yield(x) -- x表示需要发送的值,值返回以后,就挂起该协同程序
end
-- 启动程序
newProductor = coroutine.create(productor)
consumer()---文件读写
io.input([file])、io.output([file])、io.close([file])、io.read(formats)、io.lines([fn])、io.write(value)、io.flush()。io.open(fn [, m])、io.close([file])、io.seek ([p] [, of])、、、、、、、、m>r、w、a、r+、w+、a+、b、+、、、
seek:set,cur,end
-- 以只读方式打开文件
file = io.open("test.lua", "r")
-- 设置默认输入文件为 test.lua
io.input(file)
-- 输出文件第一行
print(string.format("read file:[%s]", io.read()))
-- 关闭打开的文件
io.close(file)
-- 以附加的方式打开只写文件
file = io.open("test.lua", "a")
-- 设置默认输出文件为 test.lua
io.output(file)
-- 在文件最后一行添加 Lua 注释
io.write("File content in test.lua")
print("file write success")
-- 关闭打开的文件
io.close(file)-----------------
local f = io.open("3.txt", "a+")
f:write("Happy New Year!")
f:flush()
f:seek("end", -1) --定位到文件末尾前一个字节
local str = f:read(1) --读取一个字符
print(str) --输出"!"
f:close()
面向对象、垃圾回收
--面向对象:
-- 元类
Rectangle = {area = 0, length = 0, breadth = 0}
-- 派生类的方法 new
function Rectangle:new (o,length,breadth)o = o or {}setmetatable(o, self)self.__index = selfself.length = length or 0self.breadth = breadth or 0self.area = length*breadth;return o
end
-- 派生类的方法 printArea
function Rectangle:printArea ()print("矩形面积为 ",self.area)
endr = Rectangle:new(nil,10,20)
print(r.length)
r:printArea()------ 元类
Shape = {area = 0}
-- 基础类方法 new
function Shape:new (o,side)o = o or {}setmetatable(o, self)self.__index = selfside = side or 0self.area = side*side;return o
end
-- 基础类方法 printArea
function Shape:printArea ()print("Area is", self.area)
end
-- 创建对象
myshape = Shape:new(nil,10)
myshape:printArea()--垃圾回收:
collectgarbage("collect"): 做一次完整的垃圾收集循环。通过参数 opt 它提供了一组不同的功能:
collectgarbage("count"): 以 K 字节数为单位返回 Lua 使用的总内存数。 这个值有小数部分,所以只需要乘上 1024 就能得到 Lua 使用的准确字节数(除非溢出)。
collectgarbage("restart"): 重启垃圾收集器的自动运行。
collectgarbage("setpause"): 将 arg 设为收集器的 间歇率。 返回 间歇率 的前一个值。
collectgarbage("setstepmul"): 返回 步进倍率 的前一个值。
collectgarbage("step"): 单步运行垃圾收集器。 步长"大小"由 arg 控制。 传入 0 时,收集器步进(不可分割的)一步。 传入非 0 值, 收集器收集相当于 Lua 分配这些多(K 字节)内存的工作。 如果收集器结束一个循环将返回 true 。
collectgarbage("stop"): 停止垃圾收集器的运行。 在调用重启前,收集器只会因显式的调用运行。
mytable = {"apple", "orange", "banana"}
print(collectgarbage("count"))
mytable = nil
print(collectgarbage("count"))
print(collectgarbage("collect"))
print(collectgarbage("count"))--[[
20.9560546875
20.9853515625
0
19.4111328125
]]相关文章:
C++系列十:其他-1. Lua
系列文章目录 Lua 系列文章目录前言Lua介绍:参考链接: 基本语法:函数、迭代器table、userdata、模块元素、元方法:协程、文件读写面向对象、垃圾回收 前言 我写这个博客的一个问题?(●’◡’●) 居然是 取名太难了。 …...
不知道打仗之害,就不知道打仗之利
不知道打仗之害,就不知道打仗之利 【安志强趣讲《孙子兵法》第7讲】 【原文】 夫钝兵挫锐,屈力殚货,则诸侯乘其弊而起,虽有智者,不能善其后矣。 【注释】 屈力殚货:屈力,指力量消耗,…...
【leetcode】242. 有效的字母异位词(easy)
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。 思路: 先比较两字符串长度是否相同,如果不同直接返回false。创建…...
Windows电脑快速搭建FTP服务教程
FTP介绍 FTP(File Transfer Protocol)是一种用于在计算机网络上进行文件传输的标准协议。它提供了一种可靠的、基于客户端-服务器模型的方式来将文件从一个主机传输到另一个主机。在本文中,我将详细介绍FTP的工作原理、数据传输模式以及常见…...
Arduino驱动MQ2模拟烟雾传感器(气体传感器篇)
目录 1、传感器特性 2、硬件原理图 3、控制器和传感器连线图 4、驱动程序 MQ2气体传感器,可以很灵敏的检测到空气中的烟雾、液化气、丁烷、丙烷、甲烷、酒精、氢气等气体,与Arduino结合使用,可以制作火灾烟雾报警、液化气、丁烷、丙烷、甲烷、酒精、氢气气体泄露报警等相…...
常见分布式ID解决方案总结:数据库、算法、开源组件
常见分布式ID解决方案总结 分布式ID分布式ID方案之数据库数据库主键自增数据库号段模式Redis自增MongoDB 分布式ID方案之算法UUIDSnowflake(雪花算法) 雪花算法的使用IdWorker工具类配置分布式ID生成器 分布式ID方案之开源组件uid- generator(百度)Tinyid(滴滴&…...
记录--Loading 用户体验 - 加载时避免闪烁
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 在切换详情页中有这么一个场景,点击上一条,会显示上一条的详情页,同理,点击下一条,会显示下一条的详情页。 伪代码如下所示: 我们…...
系统架构设计专业技能 · 软件工程之软件测试与维护(六)【系统架构设计师】
系列文章目录 系统架构设计专业技能 网络规划与设计(三)【系统架构设计师】 系统架构设计专业技能 系统安全分析与设计(四)【系统架构设计师】 系统架构设计高级技能 软件架构设计(一)【系统架构设计师…...
基于亚奈奎斯特采样和SOMP算法的平板脉冲响应空间插值matlab仿真
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ...................................................................... %fine regular gr…...
柏睿向量数据库Rapids VectorDB赋能企业级大模型构建及智能应用
ChatGPT的问世,在为沉寂已久的人工智能重新注入活力的同时,也把长期默默无闻的向量数据库推上舞台。今年4月以来,全球已有4家知名向量数据库公司先后获得融资,更加印证了向量数据库在AI大模型时代的价值。 什么是向量数据库? 在认识向量数据库前,先来了解一下最常见的关…...
装备合成(牛客)
登录—专业IT笔试面试备考平台_牛客网 题目: 牛牛有x件材料a和y件材料b,用2件材料a和3件材料b可以合成一件装备,用4件材料a和1件材料b也可以合成一件装备。牛牛想要最大化合成的装备的数量,于是牛牛找来了你帮忙。 分析ÿ…...
C语言学习之一级指针二级指针
一级指针:内存中每个字节都有一个编号,这个编号就是指针,也称作地址;专门用来存储地址的变量,就是指针变量;定义一级指针变量并初始化: 数据类型 *指针变量名 &普通变量名; 数据类型 *指针…...
【腾讯云 Cloud Studio 实战训练营】使用 Cloud Studio 快速构建 Vue + Vite 完成律师 H5 页面
【腾讯云 Cloud Studio 实战训练营】使用 Cloud Studio 快速构建 Vue Vite 完成律师 H5 页面 前言一、基本介绍1.应用场景2.产品优势 二、准备工作1.注册 Cloud Studio2.进入 Vue 预置开发环境 三、使用 Cloud Studio 快速构建 Vue Vite 完成律师 H5 页面1.安装相关依赖包2.主…...
Vim常用指令
Vim常用指令 Vim是一个强大的文本编辑器,它在命令行界面下工作,拥有丰富的功能和快捷键。本文将介绍一些常用的Vim指令,帮助您更高效地使用Vim编辑器。 基本操作 以下是一些基本的Vim操作指令: i:进入插入模式&…...
24届近3年青岛理工大学自动化考研院校分析
今天给大家带来的是青岛理工大学控制考研分析 满满干货~还不快快点赞收藏 一、青岛理工大学 学校简介 青岛理工大学是一所以工为主,土木建筑、机械制造、环境能源学科特色鲜明,理工经管文法艺等学科协调发展的多科性大学。是国家首批地方…...
进入现代云技术的世界-APIGateway、ServiceMesh、OpenStack、异步化框架、云原生框架、命令式API与声明式API
目录 APIGateway Service Mesh OpenStack 异步化框架 云原生框架 命令式API与声明式API APIGateway API网关(API Gateway)是一个服务器——充当了客户端和内部服务之间的中间层。API网关负责处理API请求,将客户端的请求路由到相应的后端…...
Macbook 终端 git 命令补全和提示
Mac OS自带的终端,用起来虽然有些不太方便,界面也不够友好,关键是在windows上用习惯了自动补全功能,在Mac上一个个的拼写单词是真的难受,逼着我记英文单词。 经过一天的磨合,我实在忍不了,在网上…...
2024考研408-计算机网络 第六章-应用层学习笔记
文章目录 前言一、网络应用模型1.1、认识应用层功能和特点1.2、网络应用层模型:1.2.1、客户/服务器(C/S)模型1.2.2、P2P模型 二、DNS系统2.1、认识DNS与IP地址的关系2.2、DNS解析的大致流程2.3、域名的分类2.4、域名服务器的分类2.5、域名解析…...
使用阿里云服务器部署和使用GitLab
本文阿里云百科分享使用阿里云服务器部署和使用GitLab,GitLab是Ruby开发的自托管的Git项目仓库,可通过Web界面访问公开的或者私人的项目。本教程介绍如何部署和使用GitLab。 目录 准备工作 部署GitLab环境 使用GitLab 登录GitLab 生成密钥对文件并…...
React入门学习笔记3
事件处理 通过onXxx属性指定事件处理函数(注意大小写) React使用的是自定义(合成)事件, 而不是使用的原生DOM事件——为了更好的兼容性 eg:οnclick》onClickReact中的事件是通过事件委托方式处理的(委托给组件最外层的元素)——为了更高效通过event.target得到发生…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...
QT开发技术【ffmpeg + QAudioOutput】音乐播放器
一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下,音视频内容犹如璀璨繁星,点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频,到在线课堂中知识渊博的专家授课,再到影视平台上扣人心弦的高清大片,音…...
AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...
