当前位置: 首页 > news >正文

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 字节)内存的工作。 如果收集器结束一个循环将返回 truecollectgarbage("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介绍&#xff1a;参考链接&#xff1a; 基本语法&#xff1a;函数、迭代器table、userdata、模块元素、元方法&#xff1a;协程、文件读写面向对象、垃圾回收 前言 我写这个博客的一个问题&#xff1f;(●’◡’●) 居然是 取名太难了。 …...

不知道打仗之害,就不知道打仗之利

不知道打仗之害&#xff0c;就不知道打仗之利 【安志强趣讲《孙子兵法》第7讲】 【原文】 夫钝兵挫锐&#xff0c;屈力殚货&#xff0c;则诸侯乘其弊而起&#xff0c;虽有智者&#xff0c;不能善其后矣。 【注释】 屈力殚货&#xff1a;屈力&#xff0c;指力量消耗&#xff0c;…...

【leetcode】242. 有效的字母异位词(easy)

给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次数都相同&#xff0c;则称 s 和 t 互为字母异位词。 思路&#xff1a; 先比较两字符串长度是否相同&#xff0c;如果不同直接返回false。创建…...

Windows电脑快速搭建FTP服务教程

FTP介绍 FTP&#xff08;File Transfer Protocol&#xff09;是一种用于在计算机网络上进行文件传输的标准协议。它提供了一种可靠的、基于客户端-服务器模型的方式来将文件从一个主机传输到另一个主机。在本文中&#xff0c;我将详细介绍FTP的工作原理、数据传输模式以及常见…...

Arduino驱动MQ2模拟烟雾传感器(气体传感器篇)

目录 1、传感器特性 2、硬件原理图 3、控制器和传感器连线图 4、驱动程序 MQ2气体传感器,可以很灵敏的检测到空气中的烟雾、液化气、丁烷、丙烷、甲烷、酒精、氢气等气体,与Arduino结合使用,可以制作火灾烟雾报警、液化气、丁烷、丙烷、甲烷、酒精、氢气气体泄露报警等相…...

常见分布式ID解决方案总结:数据库、算法、开源组件

常见分布式ID解决方案总结 分布式ID分布式ID方案之数据库数据库主键自增数据库号段模式Redis自增MongoDB 分布式ID方案之算法UUIDSnowflake(雪花算法) 雪花算法的使用IdWorker工具类配置分布式ID生成器 分布式ID方案之开源组件uid- generator(百度)Tinyid&#xff08;滴滴&…...

记录--Loading 用户体验 - 加载时避免闪烁

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 在切换详情页中有这么一个场景&#xff0c;点击上一条&#xff0c;会显示上一条的详情页&#xff0c;同理&#xff0c;点击下一条&#xff0c;会显示下一条的详情页。 伪代码如下所示&#xff1a; 我们…...

系统架构设计专业技能 · 软件工程之软件测试与维护(六)【系统架构设计师】

系列文章目录 系统架构设计专业技能 网络规划与设计&#xff08;三&#xff09;【系统架构设计师】 系统架构设计专业技能 系统安全分析与设计&#xff08;四&#xff09;【系统架构设计师】 系统架构设计高级技能 软件架构设计&#xff08;一&#xff09;【系统架构设计师…...

基于亚奈奎斯特采样和SOMP算法的平板脉冲响应空间插值matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ...................................................................... %fine regular gr…...

柏睿向量数据库Rapids VectorDB赋能企业级大模型构建及智能应用

ChatGPT的问世,在为沉寂已久的人工智能重新注入活力的同时,也把长期默默无闻的向量数据库推上舞台。今年4月以来,全球已有4家知名向量数据库公司先后获得融资,更加印证了向量数据库在AI大模型时代的价值。 什么是向量数据库? 在认识向量数据库前,先来了解一下最常见的关…...

装备合成(牛客)

登录—专业IT笔试面试备考平台_牛客网 题目&#xff1a; 牛牛有x件材料a和y件材料b&#xff0c;用2件材料a和3件材料b可以合成一件装备&#xff0c;用4件材料a和1件材料b也可以合成一件装备。牛牛想要最大化合成的装备的数量&#xff0c;于是牛牛找来了你帮忙。 分析&#xff…...

C语言学习之一级指针二级指针

一级指针&#xff1a;内存中每个字节都有一个编号&#xff0c;这个编号就是指针&#xff0c;也称作地址&#xff1b;专门用来存储地址的变量&#xff0c;就是指针变量&#xff1b;定义一级指针变量并初始化&#xff1a; 数据类型 *指针变量名 &普通变量名; 数据类型 *指针…...

【腾讯云 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是一个强大的文本编辑器&#xff0c;它在命令行界面下工作&#xff0c;拥有丰富的功能和快捷键。本文将介绍一些常用的Vim指令&#xff0c;帮助您更高效地使用Vim编辑器。 基本操作 以下是一些基本的Vim操作指令&#xff1a; i&#xff1a;进入插入模式&…...

24届近3年青岛理工大学自动化考研院校分析

今天给大家带来的是青岛理工大学控制考研分析 满满干货&#xff5e;还不快快点赞收藏 一、青岛理工大学 学校简介 青岛理工大学是一所以工为主&#xff0c;土木建筑、机械制造、环境能源学科特色鲜明&#xff0c;理工经管文法艺等学科协调发展的多科性大学。是国家首批地方…...

进入现代云技术的世界-APIGateway、ServiceMesh、OpenStack、异步化框架、云原生框架、命令式API与声明式API

目录 APIGateway Service Mesh OpenStack 异步化框架 云原生框架 命令式API与声明式API APIGateway API网关&#xff08;API Gateway&#xff09;是一个服务器——充当了客户端和内部服务之间的中间层。API网关负责处理API请求&#xff0c;将客户端的请求路由到相应的后端…...

Macbook 终端 git 命令补全和提示

Mac OS自带的终端&#xff0c;用起来虽然有些不太方便&#xff0c;界面也不够友好&#xff0c;关键是在windows上用习惯了自动补全功能&#xff0c;在Mac上一个个的拼写单词是真的难受&#xff0c;逼着我记英文单词。 经过一天的磨合&#xff0c;我实在忍不了&#xff0c;在网上…...

2024考研408-计算机网络 第六章-应用层学习笔记

文章目录 前言一、网络应用模型1.1、认识应用层功能和特点1.2、网络应用层模型&#xff1a;1.2.1、客户/服务器&#xff08;C/S&#xff09;模型1.2.2、P2P模型 二、DNS系统2.1、认识DNS与IP地址的关系2.2、DNS解析的大致流程2.3、域名的分类2.4、域名服务器的分类2.5、域名解析…...

使用阿里云服务器部署和使用GitLab

本文阿里云百科分享使用阿里云服务器部署和使用GitLab&#xff0c;GitLab是Ruby开发的自托管的Git项目仓库&#xff0c;可通过Web界面访问公开的或者私人的项目。本教程介绍如何部署和使用GitLab。 目录 准备工作 部署GitLab环境 使用GitLab 登录GitLab 生成密钥对文件并…...

React入门学习笔记3

事件处理 通过onXxx属性指定事件处理函数(注意大小写) React使用的是自定义(合成)事件, 而不是使用的原生DOM事件——为了更好的兼容性 eg&#xff1a;οnclick》onClickReact中的事件是通过事件委托方式处理的(委托给组件最外层的元素)——为了更高效通过event.target得到发生…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...