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得到发生…...
HunyuanVideo-Foley镜像免配置:彻底告别torch版本冲突与依赖地狱
HunyuanVideo-Foley镜像免配置:彻底告别torch版本冲突与依赖地狱 1. 镜像概述与核心优势 HunyuanVideo-Foley私有部署镜像是一款专为视频生成与音效生成任务深度优化的解决方案。基于RTX 4090D 24GB显存和CUDA 12.4环境构建,它彻底解决了AI开发者最头疼…...
璀璨星河Starry Night Art Gallery部署教程:Streamlit镜像一键开箱即用
璀璨星河Starry Night Art Gallery部署教程:Streamlit镜像一键开箱即用 1. 开篇:走进AI艺术创作新世界 你是否曾经想过,只需要输入一段文字描述,就能生成一幅充满艺术感的画作?璀璨星河Starry Night Art Gallery正是…...
Wan2.2-I2V-A14B多场景应用:跨境电商商品多角度展示视频自动生成
Wan2.2-I2V-A14B多场景应用:跨境电商商品多角度展示视频自动生成 1. 跨境电商视频制作新方案 在跨境电商领域,商品展示视频是提升转化率的关键因素。传统视频制作方式面临三大痛点: 成本高昂:专业拍摄团队单条视频报价通常在50…...
JavaScript中Number构造函数对各种类型的转换规则
Number构造函数用于类型转换,空字符串转0,布尔值true/false转1/0,null转0、undefined转NaN,对象先调用toString再解析,Symbol和BigInt抛TypeError。Number构造函数在JavaScript中用于将其他类型值转换为数字࿰…...
软件规模-功能点分析法
功能点分析法是在20世纪70年代中期由IBM委托 Allan Albrecht 工程师和他的同事为解决代码行度量法所产生的问题和局限性而研究发布,发表于1979年,随后被国际功能点用户协会继承。该方法基于应用软件的外部,内部特性以及软件性能进行一系列间接…...
【AGI物流落地倒计时】:为什么2026年Q2成为企业接入自主决策物流AI的最后窗口期?
第一章:2026奇点智能技术大会:AGI与物流管理 2026奇点智能技术大会(https://ml-summit.org) AGI驱动的动态物流决策中枢 在2026奇点智能技术大会上,多家头部物流企业联合发布了基于自主推理架构(Autonomous Reasoning Architect…...
三步解锁Switch潜能:大气层系统从零到精通的实践指南
三步解锁Switch潜能:大气层系统从零到精通的实践指南 【免费下载链接】Atmosphere-stable 大气层整合包系统稳定版 项目地址: https://gitcode.com/gh_mirrors/at/Atmosphere-stable 大气层系统(Atmosphere)作为Nintendo Switch最稳定…...
AGI与量子计算融合的7个致命断层:2026奇点大会未公开技术白皮书首曝
第一章:AGI与量子计算融合的范式危机与奇点临界态 2026奇点智能技术大会(https://ml-summit.org) 当通用人工智能(AGI)的推理架构遭遇量子叠加态的本征坍缩机制,传统冯诺依曼—图灵范式正经历不可逆的结构性失稳。实验表明&#…...
从ISO9506到实际报文:手把手用Wireshark解码一个MMS数据包(含ASN.1/BER解析实战)
从ISO9506到实际报文:手把手用Wireshark解码一个MMS数据包(含ASN.1/BER解析实战) 当你面对工业控制网络中捕获的陌生流量时,能否准确识别出隐藏在TCP端口102背后的MMS协议通信?本文将带你从协议标准出发,通…...
SQL分组统计时如何处理文本类型聚合_GROUP_CONCAT的用法
GROUP_CONCAT返回NULL或空字符串主因是默认忽略NULL值,全NULL则结果为NULL;结果截断因默认长度1024;需用IFNULL预处理、调大group_concat_max_len、显式ORDER BY和SEPARATOR,并依场景选JSON_ARRAYAGG。GROUP_CONCAT 为什么返回 NU…...
