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

Lua调用C#

目录

创建C#入口

Lua调用类

 Lua调用枚举

 Lua调用数组,列表,字典

 Lua调用C#拓展方法

Lua调用C#Ref与Out知识

Lua调用C#函数重载

Lua调用C#委托与事件

Lua调用C#二维数组

Lua调用C#中nil与null的差距

Lua调用C#中让系类型与lua能够互相访问

Lua调用C#协程

Lua调用C#泛型


创建C#入口

首先我们新建一个C#脚本,取名为Main,因为Lua中没有办法直接访问C#,一定是先从C#中调用lua再将核心逻辑让lua来编写

public class Main : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){LuaMgr.GetInstance().Init();LuaMgr.GetInstance().DoLuaFile("Main");}}

Lua调用类

创建调用类的脚本,然后再Main的脚本中调用

require("Lesson1CallClass")

接着来编写调用类的lua脚本

print("----------------------Lua调用C#类相关知识---------------------")--lua中使用C#的类
--固定格式:CS.命名空间.类名
--Unity的类 比如 GameObject Transform等—— CS.UnityEngine.类名
--CS.UnityEngine.GameObject--通过C#中的类实例化一个对象
--lua中没有new,直接类名括括号就是实例化对象
--默认调用的,相当于就是无参构造
local obj1=CS.UnityEngine.GameObject()
local obj2=CS.UnityEngine.GameObject("xxx")--为了方便使用与节约性能,定义全局变量存储C#的类
GameObject=CS.UnityEngine.GameObject
local obj3=GameObject("yyyyy")--类中的静态对象可以直接使用.来调用
local obj4=GameObject.Find("xxx")--得到其中的成员变量也是直接.对象
print(obj4.transform.position)
CS.UnityEngine.Debug.Log(obj4.transform.position)--使用对象中的成员方法,要加:调用
Vector3=CS.UnityEngine.Vector3
obj4.transform:Translate(Vector3.right)
CS.UnityEngine.Debug.Log(obj4.transform.position)

运行出现为:1.场景中出现空物体 2.打印信息 3.位置坐标发生修改

 刚才调用的都是U3d中自带的类,现在我们尝试C#自定义类

public class Test
{public void Speak(string str){Debug.Log("Test" + str);}
}namespace tx
{public class Test2{public void Speak(string str){Debug.Log("Test2"+str);}}
}
--调用没有在命名空间中的自定义类
local t1=CS.Test()
t1:Speak("11111111")--调用在命名空间中的自定义类
local t2=CS.tx.Test2()
t2:Speak("2222222")

继承Mono的类:

--继承Mono的类,是不能直接new的
local obj5=GameObject("加脚本Test")
--通过GameObject的AddComponent添加脚本,由于lua中不支持无参泛型函数,我们使用另一个重载
--xlua提供一个方法typeof 得到类的type
obj5:AddComponent(typeof(CS.LuaCallCSharp))

运行可以看到

 Lua调用枚举

新建一个lua脚本在Main中调用,然后写

--枚举调用
--调用Unity中的枚举
--枚举调用规则与调用类相似:CS.命名空间.枚举名.枚举成员PrimitiveType=CS.UnityEngine.PrimitiveType
GameObject=CS.UnityEngine.GameObjectlocal obj = GameObject.CreatePrimitive(PrimitiveType.Cube)

这样在场景中就会出现一个Cube

如果是自定义脚本,在C#中

public enum myem
{Idel,Move,Jump,Atk
}

然后在lua中我们调用并进行枚举的一系列转换,利用.__CastFrom(),可以看到

--自定义枚举
myem=CS.myem
local x=myem.Idel
print(x)--枚举转换相关rgs
--数值转枚举
local a=myem.__CastFrom(1)
print(a)
--字符串转枚举
local b=myem.__CastFrom("Atk")
print(b)

 Lua调用数组,列表,字典

数组,列表,字典在lua中的使用都遵循C#的规则,我们先在C#中创建

    public int[]  arr=new int[5] { 1, 2, 3 ,7,6};public List<int> list=new List<int>();public Dictionary<int,string> dic = new Dictionary<int,string>();

 对于数组,在lua中长度的获取,元素遍历如下:

local obj =CS.Lesson3()--长度获取,C#怎么用,lua怎么用
print(obj.arr.Length)
--访问元素,虽然lua中数组从1开始,但是访问的数组是C#的规则,从0开始
print(obj.arr[1])
--遍历
--最大值一定也减一
for i=0,obj.arr.Length-1 doprint(obj.arr[i])
end

lua中创建一个C#的数组,可以用表表示list与数组

--创建C#中的数组使用Array类中的静态方法
local arr2=CS.System.Array.CreateInstance(typeof(CS.System.Int32),10)
print(arr2.length)
print(arr2[1])

 同理在lua中向表中添加元素,遍历列表

obj.list:Add(1)
obj.list:Add(5)
obj.list:Add(3)
print(obj.list.Count)
--遍历
for i=0,obj.list.Count-1 doprint(obj.list[i])
end

在lua中创建一个list对象

--相当于得到了List<string>的一个类别名,需要再实例化
local list_String=CS.System.Collections.Generic.List(CS.System.String)
local list3=list_String()
list3:Add(222222222222222)
print(list3[0])

在lua中向字典中添加元素,遍历字典

--使用与C#一致
obj.dic:Add(1,"xxx")
print(obj.dic[1])
--遍历
for k,v in pairs(obj.dic) doprint(k,v)
end

在lua中创建一个字典对象

local Dic_String_Vector3=CS.System.Collections.Generic.Dictionary(CS.System.String,CS.UnityEngine.Vector3)
local dic2=Dic_String_Vector3()
dic2:Add("124",CS.UnityEngine.Vector3.right)
for k,v in pairs(dic2) doprint(k,v)
end
--要通过下面方法来获取
print(dic2:get_Item("124"))
--改变
dic2:set_Item("124",676)
print(dic2:get_Item("124"))

 Lua调用C#拓展方法

我们先在C#中新建一个类,并写出对应的拓展方法

如果要在lua中使用拓展方法,要在类前面加上特性[LuaCallCSharp] (建议lua中要使用的类都加上该特性,可以提升性能,因为lua是通过反射的机制调用C的类,效率低)

[LuaCallCSharp]
public static class Tools
{//Lesson4的拓展方法public static void Move(this Lesson4 obj){Debug.Log(obj.name + "移动");}
}
public class Lesson4
{public string name = "cc";public  void Speak(string str){Debug.Log(str);}public static void Eat(){Debug.Log("eat");}
}

之后在lua中调用

Lesson4=CS.Lesson4
--使用静态方法
--CS.命名空间.类名.静态方法()
Lesson4.Eat()--成员方法 实例化出来用
local  obj=Lesson4()
--成员方法调用用冒号:
obj:Speak("hhhhhhhhhh")--使用拓展方法
obj:Move()

Lua调用C#Ref与Out知识

在C#中定义三个方法

    public int RefFun(int a,ref int b,ref int c,int d){b = a + d;c = a - d;return 100;}public int OutFun(int a, out int b, out int c, int d){b = a;c = d;return 200;}public int RefOutFun(int a, out int b, ref int c){b = a * 10;c = a * 20;return 300;}

在lua中访问他们

Lesson5=CS.Lesson5
local obj = Lesson5()

对于ref, 会以多返回值形式返回给lua,如果函数存在返回值,那么第一个值就是该返回值,之后的返回值就是ref的结果。ref参数需要传一个默认值占位置,如果不传会默认传0

local a,b,c=obj:RefFun(1,0,0,1)
print(a)
print(b)
print(c)

对于out, 会以多返回值形式返回给lua,如果函数存在返回值,那么第一个值就是该返回值,之后的返回值就是out的结果,Out参数不需要传一个默认值占位置

local a,b,c=obj:OutFun(15,78)
print(a)
print(b)
print(c)

如果我们混用,则是结合两个的规则 

local a,b,c=obj:RefOutFun(10,5)

Lua调用C#函数重载

先在C#中写出重载函数

    public  int fun1(){return 111;}public int fun1(int a,int b){return a + b;}public int fun1(int a){return a ;}public float fun1( float b){return  b;}

虽然lua自己不支持写重载函数,但是支持调用C#中的重载函数

local obj = CS.Lesson6()print(obj:fun1())
print(obj:fun1(45,45))

由于lua中数值类型只有Number,对C#中多精度的重载函数支持不好,在使用时,可能会出现一些问题,如:

print(obj:fun1(45))
print(obj:fun1(4.45))

 解决方法:通过反射,但是效率低,尽量不用

--得到指定函数的相关信息
local m1=typeof(CS.Lesson6):GetMethod("fun1",{typeof(CS.System.Int32)})
local m2=typeof(CS.Lesson6):GetMethod("fun1",{typeof(CS.System.Single)})
--通过xlua提供的方法,将其转成lua函数使用
--一般转一次,然后重复使用
local f1=xlua.tofunction(m1)
local f2=xlua.tofunction(m2)--成员方法第一个参数传对象,静态方法不用
print(f1(obj,10))
print(f2(obj,10.2))

Lua调用C#委托与事件

先在C#中定义委托与事件

public class Lesson7
{//申明public UnityAction del;public event UnityAction evAction;public void DoEvent(){if (evAction != null){evAction();}}
}

委托在lua中与在C#中差不多,但是如果第一次往委托中加函数,会是nil,不能直接+,要先=


local obj = CS.Lesson7()--委托用于装函数,执行C#中的委托就是用来装lua函数的
local fun=function ()print("Lua函数Fun")
end
--lua中有复合运算符,不能+=
--如果第一次往委托中加函数,会是nil,不能直接+
--obj.del=obj.del+fun
obj.del=fun
--第二次
obj.del=obj.del+funobj.del=obj.del+function ( )print("临时申明")--但是不建议
end
--委托执行
obj.del()
print("------------------------")
--obj.del=obj.del-fun
--obj.del=obj.del-fun
obj.del()--清空所有存储的函数
obj.del=nilobj.del=funobj.del()

事件在C#中与lua中差别很大,使用类似于成员方法

local fun2=function (  )print("事件加的函数")
end--事件+-函数与委托不一样,类似使用成员方法
obj:evAction("+",fun2)
obj:evAction("+",function ( )print("临时申明")--但是不建议
end)obj:DoEvent()obj:evAction("-",fun2)
obj:DoEvent()
--清事件不能直接nil,只能在C#中加一个方法然后调用

Lua调用C#二维数组

public int[,] arr = new int[2, 3] { { 1, 2, 3 }, { 3, 4, 9 } };

在lua中调用,获取长度,元素以及遍历

local obj=CS.Lesson8()--获取长度
print("行"..obj.arr:GetLength(0))
print("列"..obj.arr:GetLength(1))--获取元素
print(obj.arr:GetValue(0,0))
print(obj.arr:GetValue(1,2))--遍历数组
for i=0,obj.arr:GetLength(0)-1 dofor j=0,obj.arr:GetLength(1)-1 doprint(obj.arr:GetValue(i,j))end
end

Lua调用C#中nil与null的差距

nil 与null是没办法进行==比较的,假设往场景对象上加一个脚本,如果存在就不加,如果不存在再加,解决方法如下:

GameObject=CS.UnityEngine.GameObjectRigidbody=CS.UnityEngine.Rigidbodylocal obj=GameObject("测试脚本")
--得到刚体组件,如果没有就加
local rig=obj:GetComponent(typeof(Rigidbody))
print(rig)
if rig ==nil thenrig=obj:AddComponent(typeof(Rigidbody))
end
print(rig)

此时打印如下:

 方法1:

if rig:Equals(nil) thenrig=obj:AddComponent(typeof(Rigidbody))
end
print(rig)

 方法2:

先在Main中写判空全局函数
function IsNull( obj )if obj==nil or obj:Equals(nil) thenreturn trueendreturn false
end在lua中:
if IsNull(rig) thenrig=obj:AddComponent(typeof(Rigidbody))
end
print(rig)

方法3:在C#中写一个拓展方法在lua中调用

[LuaCallCSharp]
public static class Lesson9
{public static bool IsNUll(this Object obj){return obj==null;}
}
if rig:IsNUll() thenrig=obj:AddComponent(typeof(Rigidbody))
end
print(rig)

Lua调用C#中让系类型与lua能够互相访问

在前面我们学习了两个特性[CSharpCallLua]和[LuaCallCSharp],其中[CSharpCallLua]主要是用于接口与委托,[LuaCallCSharp]用在拓展方法前面,也可以在每个被Lua调用的类都加,这样可以提升性能。但是对于一些系统类是无法进行修改的。比如我们要调用UI中Slider,我们在场景中创建一个Slider,然后在Lua中写

GameObject=CS.UnityEngine.GameObjectUI=CS.UnityEngine.UIlocal slider=GameObject.Find("Slider")
print(slider)local sliderSp=slider:GetComponent(typeof(UI.Slider))
print(sliderSp)
sliderSp.onValueChanged:AddListener(function ( f )print(f)
end)

这样前面两个能够正常打印但是第三个会报错。此时就需要我们在前面加上[CSharpCallLua],我们可以新建一个静态类,使用 XLua进行 C# 和 Lua 的交互配置,可以把所有特性汇总到这里。注意在保存后需要重新生成代码

public static class Lesson10
{[CSharpCallLua]public static List<Type> csharpcalllua = new List<Type>() {typeof(UnityAction<float>)};[LuaCallCSharp]public static List<Type> luacallcsharp = new List<Type>() {typeof(GameObject),typeof(Rigidbody)};
}

Lua调用C#协程

在lua中调用协程与C#中一样

--C#中协程启动通过继承mono类,通过里面的启动函数StartCoroutine
GameObject=CS.UnityEngine.GameObject
WaitForSeconds=CS.UnityEngine.WaitForSeconds
--在场景中新建空物体并挂载脚本,脚本继承mono使用开启协程
local obj = GameObject("Coroutine")
local mono=obj:AddComponent(typeof(CS.LuaCallCSharp))fun=function (  )local a=1while true do--lua中不能直接使用C#中的yield return ,使用lua中的协程返回coroutine.yield(WaitForSeconds(1))print(a)a=a+1end
endmono:StartCoroutine(fun)

此时在u3d中执行会报错 我们不能直接将lua函数传入开启到协程中

 可以采用xlua中的util工具表,这样才能正常启动协程

util=require("xlua.util")
b=mono:StartCoroutine(util.cs_generator(fun))

 停止协程可以在判断条件里面加如

fun=function (  )local a=1while true do--lua中不能直接使用C#中的yield return ,使用lua中的协程返回coroutine.yield(WaitForSeconds(1))print(a)a=a+1--关闭协程,与C#一样if a>10 thenmono:StopCoroutine(b)endend
end

Lua调用C#泛型

先在C#中准备好多种泛型函数

public class Lesson12
{public interface Itest{}public class Father{}public class Child:Father, Itest{}public void testFun1<T>(T a,T b) where T : Father{Debug.Log("有参数有约束的泛型方法");}public void testFun2<T>(T a){Debug.Log("有参数无约束的泛型方法");}public void testFun3<T>( ) where T : Father{Debug.Log("无参数有约束的泛型方法");}public void testFun4<T>(T a) where T :  Itest{Debug.Log("有参数有约束的泛型方法 ,约束不是类是接口");}
}

然后逐个在lua中调用看看是否可用

local  obj=CS.Lesson12() local child=CS.Lesson12.Child()
local father=CS.Lesson12.Father()--支持有参数有约束的泛型方法
obj:testFun1(child,father)
obj:testFun1(father,child)--不支持无约束的泛型方法
--obj:testFun2(child)--不支持有约束无参数的泛型方法
--obj:testFun3()--不支持非class的泛型方法
--obj:testFun4(child)

如果想要不支持的泛型函数被调用,可以使用下面方法:

--解决方法:得到通用函数,设置泛型类型再使用--xlua.get_generic_method(类,"函数名")
local test2=xlua.get_generic_method(CS.Lesson12,"testFun2")
local test2_R=test2(CS.System.Int32)
--调用,成员方法第一个参数传调用函数的对象;静态方法不用传
test2_R(obj,1)

但是有一定限制:如果使用mono进行打包则支持使用,如果使用IL2CPP打包,则要求泛型类型为引用类型才能使用、如果为值类型,则需要C#已经调用过同类型的泛型lua中才能使用

相关文章:

Lua调用C#

目录 创建C#入口 Lua调用类 Lua调用枚举 Lua调用数组&#xff0c;列表&#xff0c;字典 Lua调用C#拓展方法 Lua调用C#Ref与Out知识 Lua调用C#函数重载 Lua调用C#委托与事件 Lua调用C#二维数组 Lua调用C#中nil与null的差距 Lua调用C#中让系类型与lua能够互相访问 Lua调用…...

EdgeOne安全专项实践:上传文件漏洞攻击详解与防范措施

靶场搭建 当我们考虑到攻击他人服务器属于违法行为时&#xff0c;我们需要思考如何更好地保护我们自己的服务器。为了测试和学习&#xff0c;我们可以搭建一个专门的靶场来模拟文件上传漏洞攻击。以下是我搭建靶场的环境和一些参考资料&#xff0c;供大家学习和参考&#xff0…...

springboot使用Easy Excel导出列表数据为Excel

springboot使用Easy Excel导出列表数据为Excel Easy Excel官网&#xff1a;https://easyexcel.opensource.alibaba.com/docs/current/quickstart/write 主要记录一下引入时候的pom&#xff0c;直接引入会依赖冲突 解决方法&#xff1a; <!-- 引入Easy Excel的依赖 -->&l…...

现代 CPU 的高性能架构与并发安全问题

现代 CPU 的设计&#xff08;如多级缓存、指令重排&#xff09;为了提升性能&#xff0c;引入了许多优化机制&#xff0c;但这些机制可能导致并发场景下的安全性问题。并发安全性主要体现在三个方面&#xff1a;原子性、有序性 和 可见性。这些问题在底层通过 CAS&#xff08;C…...

【数模学习笔记】插值算法和拟合算法

声明&#xff1a;以下笔记中的图片以及内容 均整理自“数学建模学习交流”清风老师的课程资料&#xff0c;仅用作学习交流使用 文章目录 插值算法定义三个类型插值举例插值多项式分段插值三角插值 一般插值多项式原理拉格朗日插值法龙格现象分段线性插值 牛顿插值法 Hermite埃尔…...

JavaScript 数组及其常用方法

1. JavaScript 数组概述 数组是 JavaScript 中用于存储多个值的数据结构。它可以存储不同类型的元素&#xff0c;并提供强大的方法来操作和管理数据。数组的元素按索引&#xff08;从 0 开始&#xff09;进行访问。 2. 数组的创建方式 1) 使用数组字面量 let fruits [&quo…...

SQL HAVING 子句深入解析

SQL HAVING 子句深入解析 介绍 SQL&#xff08;Structured Query Language&#xff09;是一种用于管理关系数据库管理系统的标准编程语言。在SQL中&#xff0c;HAVING子句是与GROUP BY子句一起使用的&#xff0c;用于筛选分组后的数据。它根据聚合函数的结果对组进行条件过滤…...

vue3+ts的几个bug调试

由于编译问题&#xff0c;把几个type检查给关闭了&#xff0c;否则错误太多。 1&#xff09;第一个检查出的问题&#xff0c;拼写错误数组的length&#xff0c;写成了lengh。 2&#xff09;数组的对象引用。 torStatus Array(8).fill({ ...defaultStatus }) as TorStatus[]…...

git: hint:use --reapply-cherry-picks to include skipped commits

问&#xff1a; 当我在feture分支写完功能&#xff0c;切换到dev更新了远端dev代码&#xff0c;切回feture分支&#xff0c;git rebase dev分支后出现报错&#xff1a; warning skipped previously applied commit 709xxxx hint:use --reapply-cherry-picks to include skippe…...

Microsoft Sql Server 2019 数据类型

数据类型 bigint、int、smallint、tinyint 使用整数数据的精确数字数据类型。 若要节省数据库空间,请使用能够可靠包含所有可能值的最小数 据类型。 例如,对于一个人的年龄,tinyint 就足够了,因为没人活到 255 岁以上。 但对于建筑物的 年龄,tinyint 就不再适应,因为建…...

C++实现设计模式---代理模式 (Proxy)

代理模式 (Proxy) 代理模式 是一种结构型设计模式&#xff0c;它为其他对象提供一个代理以控制对该对象的访问。代理模式常用于延迟加载、访问控制、智能引用等场景。 意图 提供对某对象的控制。控制对目标对象的访问&#xff0c;通常用于在不改变目标对象的情况下&#xff0…...

微信小程序用的SSL证书有什么要求吗?

微信小程序主要建立在手机端使用&#xff0c;然而手机又涉及到各种系统及版本&#xff0c;所以对SSL证书也有要求&#xff0c;如果要小程序可以安全有效的访问需要满足以下要求&#xff1a; 1、原厂SSL证书&#xff08;原厂封&#xff09;。 2、DV单域名或者DV通配符。 3、兼…...

Flutter中Get.snackbar和Get.dialog关闭冲突问题记录

背景&#xff1a; 在使用GetX框架时&#xff0c;同时使用了Get.snackbar提示框和Get.dialog加载框&#xff0c;当这两个widget同时存在时&#xff0c;Get.dialog加载框调用Get.back()无法正常关闭。 冲突解释&#xff1a; 之所以会产生冲突&#xff0c;是因为Get.snackbar在关…...

命令模式-Command Pattern

什么是命令模式 命令模式是一种行为类设计模式&#xff0c;核心是将每种请求或操作封装为一个独立的对象&#xff0c;从而可以集中管理这些请求或操作&#xff0c;比如将请求队列化依次执行、或者对操作进行记录和撤销。 命令模式通过将请求的发送者(客户端)和接收者(执行请求…...

【Linux笔记】Day1

基于韩顺平老师课程记录&#xff1a; https://www.bilibili.com/video/BV1Sv411r7vd 安装CentOS 给CentOS手动分区 分为三个区&#xff1a; boot分区&#xff08;给1G就行&#xff09; 交换分区&#xff08;和内存相关&#xff0c;这里和虚拟机的内存2G一致&#xff09; …...

如何明智地提问

如何明智地提问的重要总结&#xff0c;让我为主要观点添加一些具体的实践建议&#xff1a; 提问前的准备工作 尝试在 Google、Stack Overflow 等平台搜索相似问题阅读相关文档和错误日志尝试自己调试和排查问题记录下已尝试过的解决方案 选择合适的提问平台 Stack Overflow…...

【大前端】Vue3 工程化项目使用详解

目录 一、前言 二、前置准备 2.1 环境准备 2.1.1 create-vue功能 2.1.2 nodejs环境 2.1.3 配置nodejs的环境变量 2.1.4 更换安装包的源 三、工程化项目创建与启动过程 3.1 创建工程化项目 3.2 项目初始化 3.3 项目启动 3.4 核心文件说明 四、VUE两种不同的API风格 …...

window.print()预览时表格显示不全

问题描述&#xff1a;使用element的table组件&#xff0c;表格列宽为自适应&#xff0c;但使用window.print()方法预览的页面会直接按预览宽度截取表格内容进行展示&#xff0c;造成表格可能的显示不全问题 解决方法&#xff1a;添加如下样式 media print {::v-deep {// 表头…...

《解锁鸿蒙Next系统人工智能语音助手开发的关键步骤》

在当今数字化时代&#xff0c;鸿蒙Next系统与人工智能的融合为开发者带来了前所未有的机遇&#xff0c;开发一款人工智能语音助手应用更是备受关注。以下是在鸿蒙Next系统上开发人工智能语音助手应用的关键步骤&#xff1a; 环境搭建与权限申请 安装开发工具&#xff1a;首先需…...

计算机网络之---MAC协议

MAC协议的作用 在数据链路层中&#xff0c;MAC&#xff08;媒介访问控制&#xff09;协议负责控制设备如何访问共享的通信介质&#xff08;如以太网、无线电波等&#xff09;&#xff0c;确保在多台设备共享同一传输媒介时能够有效地进行数据传输&#xff0c;避免冲突、控制流…...

系统思考—要素连接

“改变你的思维&#xff0c;就能改变你的世界”— 诺曼皮尔 世界上的所有事物&#xff0c;都在规律的支配下&#xff0c;以系统的方式运转。显性的部分是我们能看到的“要素”&#xff0c;而那些看不见的力量&#xff0c;正是推动系统运作的要素之间的相互作用。更隐秘的&…...

influxdb 采集node_exporter数据

一、打开Scrapers添加 node_exporter地址&#xff1a;http://192.168.31.135:9100/metrics 查看数据...

数据链路层-STP

生成树协议STP&#xff08;Spanning Tree Protocol&#xff09; 它的实现目标是&#xff1a;在包含有物理环路的网络中&#xff0c;构建出一个能够连通全网各节点的树型无环逻辑拓扑。 选举根交换机&#xff1a; 选举根端口&#xff1a; 选举指定端口&#xff1a; 端口名字&…...

学技术学英语:ELK是什么

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#xff1a; 先看关键单词&#xff0c;再看英文&#xff0c;最后看中文总结&#xff0c;再回头看一遍英文原文&#xff0c;效果更佳&#xff01;&#xff01; 关键词 aggregate 聚合 /ˈɡrɪɡeɪt/ analytics 分析学 /ˌnəˈl…...

快速实现一个快递物流管理系统:实时更新与状态追踪

物流管理是电商、仓储和配送等行业的重要组成部分。随着电子商务的快速发展&#xff0c;快递物流的高效管理和实时状态更新变得尤为关键。本文将演示如何使用Node.js、Express、MongoDB等技术快速构建一个简单的快递物流管理系统&#xff0c;该系统支持快递订单的实时更新和追踪…...

android分区和root

线刷包内容&#xff1a; 线刷包是一个完整的android镜像&#xff0c;不但包括android、linux和用户数据&#xff0c;还包括recovery等。当然此图中没有recovery,但是我们可以自己刷入一个。 主要分区 system.img 系统分区&#xff0c;包括linux下主要的二进制程序。 boot.img…...

【Go】:深入解析 Go 1.24:新特性、改进与最佳实践

前言 Go 1.24 尚未发布。这些是正在进行中的发布说明。Go 1.24 预计将于 2025 年 2 月发布。本文将深入探讨 Go 1.24 中引入的各项更新&#xff0c;并通过具体示例展示这些变化如何影响日常开发工作&#xff0c;确保为读者提供详尽而有价值的参考。 新特性及改进综述 HTTP/2 …...

Vue3组件通讯——自定义事件(子->父)

需求如下&#xff1a; 1.在子组件中&#xff0c;当用户点击提交按钮后&#xff0c;更新数据库 2.数据更新成功后&#xff0c;子组件通知父组件getUserInfo函数&#xff0c;重新获取数据&#xff0c;同步更新 3.子组件等待getUserInfo函数执行完毕后&#xff0c;调用init函数…...

【Rust自学】12.2. 读取文件

12.2.0. 写在正文之前 第12章要做一个实例的项目——一个命令行程序。这个程序是一个grep(Global Regular Expression Print)&#xff0c;是一个全局正则搜索和输出的工具。它的功能是在指定的文件中搜索出指定的文字。 这个项目分为这么几步&#xff1a; 接收命令行参数读…...

《OpenCV计算机视觉实战项目》——银行卡号识别

文章目录 项目任务及要求项目实现思路项目实现及代码导入模块设置参数对模版图像中数字的定位处理银行卡的图像处理读取输入图像&#xff0c;预处理找到数字边框使用模版匹配&#xff0c;计算匹配得分 画出并打印结果 项目任务及要求 任务书&#xff1a; 要为某家银行设计一套…...

Windows 下Mamba2 / Vim / Vmamba 环境安装问题记录及解决方法终极版(无需绕过triton)

导航 安装教程导航 Mamba 及 Vim 安装问题参看本人博客&#xff1a;Mamba 环境安装踩坑问题汇总及解决方法&#xff08;初版&#xff09;Linux 下Mamba 及 Vim 安装问题参看本人博客&#xff1a;Mamba 环境安装踩坑问题汇总及解决方法&#xff08;重置版&#xff09;Windows …...

OpenCV的一种改进型的素描特效算法

实现素描特效的原理主要基于图像处理中的边缘检测和灰度反转等技术。边缘检测能够突出图像中的轮廓信息&#xff0c;而灰度反转则用于增强对比&#xff0c;使图像看起来更像手绘素描。 1 素描特效的常规算法 图像读取与预处理 使用图像处理库&#xff08;如OpenCV&#xff09;…...

Maven核心插件之maven-resources-plugin

前言 Maven 插件是 Maven 构建系统的重要组成部分&#xff0c;它们为 Maven 提供了丰富的功能和扩展能力&#xff0c;使得 Maven 不仅是一个构建工具&#xff0c;更是一个强大的项目管理平台。在 Maven 项目中&#xff0c;插件的使用通常通过配置 pom.xml 文件来完成。每个插件…...

LeetCode 283题:移动零

LeetCode 283题&#xff1a;移动零 (Move Zeroes) LeetCode 第283题要求将数组中的所有零移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 题目描述 给定一个数组 nums&#xff0c;编写一个函数将所有的 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序…...

常见的开源协议及注意事项【精简版】

注&#xff1a; 以下内容出自Github Copilot。 常见的开源协议有以下几种&#xff0c;每种协议都有其特定的使用场景和注意事项&#xff1a; MIT许可证&#xff1a; 特点&#xff1a;非常宽松&#xff0c;允许用户自由使用、复制、修改、合并、发布、分发、再许可和/或销售软件…...

【Oracle专栏】2个入参,生成唯一码处理

Oracle相关文档&#xff0c;希望互相学习&#xff0c;共同进步 风123456789&#xff5e;-CSDN博客 1.背景 业务需要&#xff1a;2个参数&#xff0c;如 aidbankid &#xff0c;两个值是联合主键&#xff0c;需要生成一个固定唯一码&#xff0c;长度有限制32位&#xff0c;为了…...

component-动态控制 div width 的值 根据传入的变量决定width的值 vue

1.实现 根据参数的值&#xff0c;div显示不同的长度 <div class"node-line" :style"lineProgress"></div> <script>export default {name: "trainSummaryInfo",data(){return{linePercentage:200,}},computed:{lineProgress…...

<2025 网络安全>《网络安全政策法规-关键信息基础设施安全保护条例》

1 政策出台背景 ‌《关键信息基础设施安全保护条例》的实施背景主要包括以下几个方面‌&#xff1a; 首先&#xff0c;‌关键信息基础设施在经济社会中的重要地位使其成为网络安全的核心保护对象‌。关键信息基础设施包括公共通信和信息服务、能源、交通、水利、金融、公共服…...

【MySQL数据库】基础总结

目录 前言 一、概述 二、 SQL 1. SQL通用语法 2. SQL分类 3. DDL 3.1 数据库操作 3.2 表操作 4. DML 5. DQL 5.1 基础查询 5.2 条件查询 5.3 聚合函数 5.4 分组查询 5.5 排序查询 5.6 分页查询 6. DCL 6.1 管理用户 6.2 权限控制 三、数据类型 1. 数值类…...

acwing_5721_化学方程式配平

acwing_5721_化学方程式配平 这是一道T3的题目&#xff0c;操作起来可能有些棘手&#xff0c;但是耐下心来做一遍会有收获的&#xff01; 下面是对于大佬的题解进行的注释 #include <iostream> #include <string> #include <map> #include <vector>…...

C++ 中的 template <typename T> 用法 ← 泛型

【语法解析】 ● C 中的 template <typename T> 用法 template <typename T> 是C编程语言中的一个模板声明&#xff0c;用于定义一个模板&#xff0c;其中 T 是一个模板参数&#xff0c;可以是任何类型。这种机制允许程序员编写与类型无关的代码&#xff0c;从而提…...

C语言 操作符_位操作符、赋值操作符、单目操作符

1.位操作符 & - 按&#xff08;2进制&#xff09;位与 | - 按&#xff08;2进制&#xff09;位或 ^ - 按&#xff08;2进制&#xff09;位异或 只适用于整型 例&#xff1a;实现交换两个变量的值&#xff0c;要求不能新建变量 //3^3 0 -> a^a 0 //011 //011 //000 …...

C++ 鼠标轨迹算法 - 防止游戏检测

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序&#xff0c;它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言&#xff0c;原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势&#xff1a; 模拟…...

计算机网络 笔记 数据链路层3(局域网,广域网,网桥,交换机)

局域网: LAN:在某一区域内由多台计算机互联成的计算机组&#xff0c;使用广播信道 特点&#xff1a; 覆盖范围有限&#xff1a;通常局限在几千米范围内&#xff0c;比如一栋办公楼、一个校园或一个工厂等相对较小的地理区域。 数据传输速率高&#xff1a;一般能达到 10Mbps…...

【Qnx】Qnx常用工具

Qnx常用分析工具 近期项目中Qnx端常用到的工具&#xff0c;总结一下。 查看进程 Display information about the processes in the system (QNX Neutrino) pidin使用pidin命令&#xff0c;可以查看Qnx系统运行的进程信息&#xff0c;包括PID、TID、NAME、PRIO(优先级)、STATE…...

基于 Selenium 实现上海大学校园网自动登录

基于 Selenium 实现上海大学校园网自动登录 一、技术方案 核心工具&#xff1a; Selenium&#xff1a;一个用于自动化测试的工具&#xff0c;能够模拟用户在浏览器上的操作。Edge WebDriver&#xff1a;用于控制 Edge 浏览器的驱动程序。 功能设计&#xff1a; 检测网络状…...

相机小孔成像模型与透视变换

0 背景 本文用于记录小孔相机成像的数学模型推导&#xff0c;并讨论特定条件下两个相机之间看到图像的变换关系。 1 小孔成像模型 小孔成像模型如上图所示。物理世界发光点P&#xff0c;经过小孔O投影到物理成像平面&#xff0c;形成像点I’。 简易起见&#xff0c;构造虚拟成…...

微信小程序订阅消息提醒-云函数

微信小程序消息订阅分2种&#xff1a; 1.一次性订阅&#xff1a;用户订阅一次就可以推送一次&#xff0c;如果需要多次提醒需要多次订阅。 2.长期订阅&#xff1a;只有公共服务领域&#xff0c;如政务、医疗、交通、金融和教育等。‌在用户订阅后&#xff0c;在很长一段时间内…...

语音技术与人工智能:智能语音交互的多场景应用探索

引言 近年来&#xff0c;智能语音技术取得了飞速发展&#xff0c;逐渐渗透到日常生活和各行各业中。从语音助手到智能家居控制&#xff0c;再到企业客服和教育辅导&#xff0c;语音交互正以前所未有的速度改变着人机沟通的方式。这一变革背后&#xff0c;人工智能技术无疑是关键…...

ros2笔记-6.2 使用urdf创建机器人模型

本节主要跟着小鱼老师的视频操作&#xff0c;不同的仿真平台有不同的建模语言&#xff0c;但是几乎都支持URDF。 本节使用URDF创建一个机器人模型。 6.2.1 帮机器人创建一个身体 URDF使用XML来描述机器人的结构和传感器、执行器等信息。 在chapt6/chap6_ws/src创建功能包:r…...