【Rust闭包】rust语言闭包函数原理用法汇总与应用实战
✨✨ 欢迎大家来到景天科技苑✨✨
🎈🎈 养成好习惯,先赞后看哦~🎈🎈
🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Rust开发,Python全栈,Golang开发,云原生开发,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。所属的专栏:Rust语言通关之路
景天的主页:景天科技苑
文章目录
- Rust闭包
- 1. 闭包基础
- 1.1 什么是闭包
- 1.2 闭包的基本语法
- 1.3 闭包与函数的比较
- 2. 闭包的捕获方式
- 2.1 Fn:不可变借用
- 2.2 FnMut:可变借用
- 2.3 FnOnce:获取所有权
- 2.4 move关键字
- 3. 闭包作为参数和返回值
- 3.1 闭包作为函数参数
- 3.2 闭包作为结构体字段
- 3.3 闭包作为函数返回值
- 4. 闭包的实际应用案例
- 4.1 缓存/记忆化模式
- 5. 高级闭包技巧
- 5.1 闭包与生命周期
- 6. 性能考虑
- 7. 总结
Rust闭包
闭包(Closure)是 Rust 中一个强大且灵活的特性,它允许你捕获环境中的变量并在稍后执行。Rust 的闭包设计既高效又安全,是函数式编程风格的重要组成部分。
Rust 的 闭包(closures)是可以保存进变量或作为参数传递给其他函数的匿名函数。
可以在一个地方创建闭包,然后在不同的上下文中执行闭包运算。
不同于函数,闭包允许捕获调用者作用域中的值。
1. 闭包基础
1.1 什么是闭包
闭包是一种可以捕获其环境的匿名函数。与普通函数不同,闭包可以访问定义它的作用域中的变量。
fn main() {let x = 4;// 定义一个闭包,捕获变量xlet equal_to_x = |z| z == x;let y = 4;assert!(equal_to_x(y));
}
在这个例子中,闭包equal_to_x捕获了外部变量x,这是普通函数无法做到的。
1.2 闭包的基本语法
Rust闭包的基本语法如下:
两个竖线之间,是参数。竖线的后面是返回值,花括号里面是函数体,花括号可以省略
let closure_name = |parameters| -> return_type { body };
类型标注是可选的,Rust通常能推断出参数和返回值的类型:
// 完整形式
let add_one = |x: i32| -> i32 { x + 1 };// 简化形式(类型推断)。但是不能推导多次不同的类型,同一个闭包函数只能推导出一次类型
let add_one = |x| x + 1;
1.3 闭包与函数的比较
闭包和普通函数的几个关键区别:
闭包使用 || 而不是()来包围参数
闭包可以省略类型标注(编译器通常能推断)
闭包可以捕获其环境中的变量
// 函数
fn function(x: i32) -> i32 { x + 1 }
// 闭包
let closure = |x| x + 1;
2. 闭包的捕获方式
当闭包从环境中捕获一个值,闭包会在闭包体中储存这个值以供使用。
这会使用内存并产生额外的开销,当执行不会捕获环境的更通用的代码场景中我们不希望有这些开销。
因为函数从未允许捕获环境,定义和使用函数也就从不会有这些额外开销。
闭包可以通过三种方式捕获其环境,他们直接对应函数的三种获取参数的方式:获取所有权,不可变借用和可变借用。
这三种捕获值的方式被编码为如下三个 Fn trait:
Fn:从其环境不可变的借用值 。可以多次调用,不能修改捕获的变量
FnMut:可变的借用值所以可以改变其环境。可以多次调用,可以修改捕获的变量
FnOnce:消费从周围作用域捕获的变量,闭包周围的作用域被称为其 环境,environment。
为了消费捕获到的变量,闭包必须获取其所有权并在定义闭包时将其移动进闭包。
其名称的 Once 部分代表了闭包不能多次获取相同变量的所有权,所以它只能被调用一次。
当创建一个闭包时,rust会根据其如何使用环境中的变量来推断我们希望如何引用环境。
由于所有闭包都可以被调用至少一次,因此所有闭包都实现了FnOnce。
没有移动被捕获变量的所有权到闭包的闭包函数也实现了FnMut。
而不需要对捕获的变量进行可变访问的闭包实现了Fn。
2.1 Fn:不可变借用
fn main() {//闭包的捕获//不可变借用let s = String::from("hello");let print_s = || {println!("{}", s); // 不可变借用s};print_s();println!("{}", s); // 可以再次使用s
}
2.2 FnMut:可变借用
fn main() {//可变借用let mut s = String::from("hello");let mut append_world = || {s.push_str(" world"); // 可变借用sprintln!("{}", s); // 可变借用s};append_world();println!("{}", s); // 这里可以再次使用s}
2.3 FnOnce:获取所有权
fn main() {//获取所有权//获取所有权的闭包//将变量的所有权转移到闭包中,将变量返回let s = String::from("hello");// let consume_s = || {// println!("{}", s);// std::mem::drop(s); // 获取s的所有权// };//对于非Copy类型的变量,闭包会捕获变量的所有权let consume_s = || s;consume_s();// println!("{}", s); // 错误!s的所有权已被移动let x = vec![1, 2, 3];let takes_ownership = || x; // 获取x的所有权let y = takes_ownership(); // 调用闭包,获取x的所有权println!("y = {:?}", y); // 可以使用y// 这里不能再使用x// println!("{:?}", x); // 错误!x的所有权已被移动//对于Copy类型的变量,闭包会捕获变量的不可变借用let x = 4;let get_number = || x; // 捕获x的不可变借用let y = get_number(); // 调用闭包,获取x的不可变借用println!("x = {}, y = {}", x, y); // 可以使用x和y}
非Copy类型变量,闭包获取其所有权
Copy类型的变量,闭包会捕获变量的不可变借用
2.4 move关键字
使用move关键字强制闭包获取变量的所有权:
fn main() {// 闭包捕获变量的所有权// 使用move关键字强制闭包获取变量的所有权let print_s = move || {println!("{}", s);};print_s();println!("{}", s); // 错误!s的所有权已移动到闭包中
}
这在多线程编程中特别有用,可以确保数据安全地移动到新线程。
3. 闭包作为参数和返回值
3.1 闭包作为函数参数
//定义泛型函数,F可以是闭包函数
//对F进行泛型约束,必须实现Fn(i32)
fn apply<F>(f: F, x: i32) -> i32 where F: Fn(i32) -> i32 {//返回闭包函数的调用f(x)
}fn main() {//创建闭包let double = |x| x * 2;//闭包作为参数传进去apply函数println!("{}", apply(double, 5)); // 输出10
}
3.2 闭包作为结构体字段
//闭包作为结构体字段
//泛型结构体,约束为闭包函数
//泛型闭包
struct Cacher<T> where T: Fn(i32) -> i32 {//calculation属于闭包函数,作为结构体的字段calculation: T,value: Option<i32>,
}impl<T> Cacher<T> where T: Fn(i32) -> i32 {fn new(calculation: T) -> Cacher<T> {Cacher {calculation,value: None,}}//结构体方法fn value(&mut self, arg: i32) -> i32 {match self.value {Some(v) => v,None => {let v = (self.calculation)(arg);self.value = Some(v);v}}}
}fn main() {let mut cacher = Cacher::new(|x| x * 2);let result1 = cacher.value(10);println!("Result for input 10: {}", result1);let result2 = cacher.value(10); // This should use the cached valueprintln!("Result for input 10 (cached): {}", result2);let result3 = cacher.value(20); // This will compute a new valueprintln!("Result for input 20: {}", result3);
}
3.3 闭包作为函数返回值
也可以返回闭包,因为闭包的大小在编译时未知,需要使用 trait 对象或 impl Trait 语法:
//闭包作为返回值
//注意语法格式
//返回一个闭包函数
fn returns_closure() -> impl Fn(i32) -> i32 {|x| x + 1
}
fn main() {let closure = returns_closure();println!("closure: {}", closure(1));
}
或者使用 Box:
// 闭包作为返回值
// 注意语法格式
// 返回一个闭包函数
fn returns_closure() -> impl Fn(i32) -> i32 {|x| x + 1
}// 使用box
// 使用box有性能消耗
fn returns_closure_box() -> Box<dyn Fn(i32) -> i32> {Box::new(|x| x + 1)
}fn main() {let closure = returns_closure();println!("closure: {}", closure(1));let closure_box = returns_closure_box();println!("closure_box: {}", closure_box(1));
}
4. 闭包的实际应用案例
4.1 缓存/记忆化模式
使用闭包实现缓存:
//使用闭包做个缓存系统
//闭包作为结构体字段
//泛型结构体,约束为闭包函数
//泛型闭包
struct Cacher<T> where T: Fn(i32) -> i32 {//calculation属于闭包函数,作为结构体的字段calculation: T,value: Option<i32>,
}impl<T> Cacher<T> where T: Fn(i32) -> i32 {fn new(calculation: T) -> Cacher<T> {Cacher {calculation,value: None,}}//结构体方法fn value(&mut self, arg: i32) -> i32 {match self.value {Some(v) => v,None => {let v = (self.calculation)(arg);self.value = Some(v);v}}}
}fn main() {let mut cacher = Cacher::new(|x| x * 2);let result1 = cacher.value(10);println!("Result for input 10: {}", result1);let result2 = cacher.value(10); // This should use the cached valueprintln!("Result for input 10 (cached): {}", result2);let result3 = cacher.value(20); // This will compute a new valueprintln!("Result for input 20: {}", result3);
}
5. 高级闭包技巧
5.1 闭包与生命周期
当闭包捕获引用时,需要考虑生命周期:
//闭包中的生命周期
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {if x.len() > y.len() { x } else { y }
}fn main() {let string1 = String::from("long string is long");let result;{let string2 = String::from("short");let closure = || longest(&string1, &string2);result = closure();}println!("The longest string is {}", result);
}
上面的代码会编译失败,因为string2的生命周期不够长。
解决方案是让闭包只返回string1:
//闭包中的生命周期
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {if x.len() > y.len() { x } else { y }
}fn main() {let string1 = String::from("long string is long");let result;{let string2 = String::from("short");let closure = || &string1; // 只捕获string1result = closure();}println!("The longest string is {}", result);
}
6. 性能考虑
闭包在Rust中的性能与普通函数相当,因为:
闭包不进行堆分配,没有运行时开销(不像其他语言的闭包可能需要在堆上分配,除非使用Box)
编译器可以内联闭包调用
捕获环境的闭包通常会被编译器优化
7. 总结
Rust的闭包是一个强大而灵活的特性,它:
可以捕获环境中的变量
有三种捕获方式(Fn、FnMut、FnOnce)
性能与普通函数相当
广泛应用于迭代器、线程、回调等场景
可以与泛型、trait对象等Rust特性结合使用
掌握闭包的使用是成为Rust高级程序员的重要一步。通过本文的示例和实践,相信大家伙应该已经对Rust闭包有了深入的理解。
在实际开发中,多思考何时使用闭包能让代码更简洁、更富有表达力,同时也要注意闭包捕获变量的生命周期和所有权问题。
相关文章:
【Rust闭包】rust语言闭包函数原理用法汇总与应用实战
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...
裸金属服务器和云服务器之间的差别
裸金属服务器能够直接在硬件上运行,不需要额外的虚化层,让每个应用程序或者是服务都能够在实际的硬件上运行,不需要和其他虚拟服务器来共享资源;而云服务器作为一种虚拟服务器,是通过虚拟化技术为企业提供一个独立的计…...
CentOS系统中升级Python 3.12.2版本
在CentOS系统中升级Python版本是一项常见的操作,尤其是在需要使用较新功能或满足某些软件依赖的情况下。以下是详细的步骤和注意事项,帮助您顺利完成Python版本的升级。 1. 升级Python版本前的准备 在开始升级之前,请确保以下几点࿱…...
win10-django项目与mysql的基本增删改查
以下都是在win10系统下,django项目的orm框架对本地mysql的表的操作 models.py----->即表对应的类所在的位置 在表里新增数据 1.引入表对应的在models.py中的类class 2.在views.py中使用函数:类名.objects.create(字段名值,字段名"值"。。。…...
图像处理:预览并绘制图像细节
前言 因为最近在搞毕业论文的事情,要做出一下图像细节对比图,所以我这里写了两个脚本,一个用于框选并同时预览图像放大细节,可显示并返回框选图像的坐标,另外一个是输入框选图像的坐标并将放大的细节放置在图像中&…...
针对面试-微服务篇
1.Spring Cloud 5大组件有哪些? 随着SpringCloudAlibba在国内兴起,我们项目中使用了一些阿里巴巴的组件 注册中心/配置中心 Nacos 负载均衡 Ribbon 服务调用 Feign 服务保护 sentinel 服务网关 Gateway 2. 我看你之前也用过nacos、你能说下nacos与eureka的区别?…...
SRS流媒体服务器(5)源码分析之RTMP握手
1.概述 学习 RTMP 握手逻辑前,需明确两个核心问题: rtmp协议连接流程阶段rtmp简单握手和复杂握手区别 具体可以学习往期博客: RTMP协议分析_rtmp与264的关系-CSDN博客 2.rtmp握手源码分析 2.1 握手入口 根据SRS流媒体服务器(4)可知&am…...
线程池(ThreadPoolExecutor)实现原理和源码细节是Java高并发面试和实战开发的重点
一、线程池核心流程图 ----------------- | 提交任务 | submit/execute -----------------|v ----------------- | 判断核心线程数 | < corePoolSize? -----------------|Yes |Nov v [创建新线程] -----------------| 队列是否满&a…...
C# DataGridView 选中所有复选框
问题描述 在程序中尝试选中所有复选框,但出现错误。如果单击顶部的完整选中/释放复选框,同时选中包含复选框的列,则选定区域不会改变。该如何解决? 上面的图片是点击完整版本之后的。 下面是本文的测试代码,函数 dat…...
linux 服务器安装jira-8.22.0和confluence-8.5.21
前提: 下载资源包 z_atlassian-agent-v1.3.1.zip z_atlassian-confluence-8.5.21-x64.zip z_atlassian-jira-software-8.22.0-x64.zip z_jdk-8u131-linux-x64.tar.gz z_postgresql-12.0.tar.gz 可通过作者本身资源库下载 一:服务器构建文件夹 mkdir /z …...
【计算机网络】HTTP/1.0,HTTP/1.1,HTTP/2,HTTP/3汇总讲解,清晰表格整理面试重点对比
表格汇总 对比维度HTTP/1.0HTTP/1.1HTTP/2HTTP/3传输协议TCPTCPTCP/TLS(默认加密)UDP(基于 QUIC 协议)连接方式短连接(每次请求/响应后断开)引入持久连接(Persistent Connection)&a…...
Go语言之路————并发
Go语言之路————并发 前言协程管道SelectsyncWaitGroup锁 前言 我是一名多年Java开发人员,因为工作需要现在要学习go语言,Go语言之路是一个系列,记录着我从0开始接触Go,到后面能正常完成工作上的业务开发的过程,如…...
python的家教课程管理系统
目录 技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理,难度适中…...
0x08.Redis 支持事务吗?如何实现?
回答重点 Redis 支持事务,但它的事务与 MySQL 等关系型数据库的事务有着本质区别。MySQL 中的事务严格遵循 ACID 特性,而 Redis 中的事务主要保证的是命令执行的原子性和隔离性,即所有命令在一个不可分割的操作中顺序执行,不会被其他客户端的命令请求所打断。 最关键的区…...
互联网应用的安全防线-身份证实名认证api-身份证三要素验证
随着联网技术的普及,互联网应用已深度渗透人们的生活,从购物下单到社交互动,从金融理财到在线教育,每一次的联网互动都隐藏着一个关乎安全与信任的“隐形卫士”-身份证实名认证接口功能。它如同数字世界的“电子身份证”ÿ…...
本地跑通vue-element-admin项目
GitHub - PanJiaChen/vue-element-admin: :tada: A magical vue admin https://panjiachen.github.io/vue-element-admin 通过加速clone到本地 git clone https://gitclone.com/github.com/PanJiaChen/vue-element-admin.git # 进入项目目录 cd vue-element-admin # 安装依赖…...
el-table表格列宽度自适应
需求:表格错误描述列 要求按照内容最大值设置宽度;如果没有值 则设置最小宽度 <el-table-columnv-else-if"item.prop errorDescription":key"item.code":width"flexColumnWidth(errorDescription, tableConfigA.tableDataA…...
Mysql存储过程(附案例)
文章目录 存储过程概述1、基本语法2、变量①、系统变量②、用户自定义变量③、局部变量 3、流程控制语句①、if语句②、参数③、case语句④、while语句⑤、repeat语句⑥、loop语句⑦、cursor游标⑧、handler 4、存储函数 存储过程概述 存储过程是事先经过编译并存储在数据…...
宇树科技申请 “机器人牌照” 商标,剑指机器人领域新高度
近日,据天眼查信息显示,杭州宇树科技有限公司有了一项重大举动,其申请注册了 “机器人牌照”“机牌”“Robot license”“Robot plate” 等商标,国际分类涉及科学仪器、运输工具、广告销售等多个领域,当前商标状态均为…...
计算机图形学基础--Games101笔记(一)数学基础与光栅化
数学基础 向量 点乘,叉乘和投影: 插值 三角形插值 **重心坐标:**我们通过任意点的重心坐标来插值。 V α V A β V B γ V C V\alpha V_A\beta V_B\gamma V_C VαVAβVBγVC。注意重心坐标没有投影不变性,如果插值三…...
Chrome拓展(Chrome Extension)开发定时任务插件
Chrome扩展定时任务插件开发指南 核心实现原理 使用Chrome Alarms API实现定时触发通过Service Worker保持后台运行本地存储保存任务配置 开发步骤 创建manifest文件 (manifest.json) {"manifest_version": 3,"name": "定时任务助手","…...
100G QSFP28 BIDI光模块一览:100G单纤高速传输方案|易天光通信
目录 前言 一、易天光通信100G QSFP28 BIDI光模块是什么? 二、易天光通信100G QSFP28 BIDI光模块采用的关键技术 三、100G QSFP28 BIDI光模块的优势 四、以“易天光通信100G BIDI 40km ER1光模块”为例 五、总结:高效组网,从“减”开始 关于…...
每日Prompt:迷你 3D 建筑
提示词 3D Q版迷你风格,一个充满奇趣的迷你星巴克咖啡馆,外观就像一个巨大的外带咖啡杯,还有盖子和吸管。建筑共两层,大大的玻璃窗清晰地展示出内部温馨而精致的设计:木质的家具、温暖的灯光以及忙碌的咖啡师们。街道…...
从另一个视角理解TCP握手、挥手与可靠传输
本文将深入探讨 TCP 协议中三次握手、四次挥手的原理,以及其保证可靠传输的机制。 一、三次握手:为何是三次,而非两次? 建立 TCP 连接的过程犹如一场严谨的 “对话”,需要经过三次握手才能确保通信双方的可靠连接。 三…...
SearxNG本地搜索引擎
SearxNG 是一个强大、开源的 元搜索引擎(meta search engine),它不会存储用户信息,注重隐私保护,并支持从多个搜索引擎聚合结果,用户可以自建部署,打造一个无广告、可定制的搜索平台。 🔍 什么是 SearxNG? SearxNG 是 Searx 的一个积极维护的分支(fork),意在改进…...
基于支持向量机(SVM)的P300检测分类
基于支持向量机(SVM)的P300检测分类MATLAB实现,包含数据预处理、特征提取和分类评估流程: %% P300检测分类完整流程(SVM实现) clc; clear; close all;%% 1. 数据加载与模拟生成(实际应用需替换…...
Oracle学习日记--Oracle中使用单个inert语句实现插入多行记录
目录 前言: 问题现象: 问题分析: 解决方法: 1、insert into ... union all句式 2、insert all into ...select 1 from dual句式 总结: 前言: 最近项目中使用到了Oracle数据库,由于Oracle数…...
利用边缘计算和工业计算机实现智能视频分析
在人工智能和物联网取得重大进步的时代,智能视频分析(IVA)正在通过整合先进的人工智能技术来改变视频监控和分析。这项革命性的技术增强了视觉智能,是关键行业创新解决方案的驱动因素。在本文中,我们将介绍IVA的好处、…...
tomcat一闪而过,按任意键继续以及控制台中文乱码问题
问题描述 今天在打开tomcat,启动startup.bat程序时 tomcat直接闪退,后面查找资料后发现,可以通过编辑startup.bat文件内容,在最后一行加入pause即可让程序不会因为异常而终止退出 这样方便查看tomcat所爆出的错误: 然后,我明确看到我的tomcat启动程序显示如下的内容,没有明确…...
go 集成base64Captcha 支持多种验证码
base64Captcha 是一个基于 Go 语言开发的验证码生成库,主要用于在 Web 应用中集成验证码功能,以增强系统的安全性。以下是其主要特点和简介: base64Captcha主要功能 验证码类型丰富:支持生成多种类型的验证码,包括纯…...
【数据结构】线性表--栈
【数据结构】线性表--栈 一.什么是栈二.栈的实现1.栈结构定义:2.栈的初始化:3.栈的销毁:4.插入函数:5.删除函数:6.求栈顶元素:7.求数据个数:8.判空: 三.总结 一.什么是栈 栈是一种重…...
基于亚博K210开发板——麦克风录播测试
开发板 亚博K210开发板 实验目的 本次测试主要学习 K210 通过 I2S 接收和发送的功能,麦克风录音,扬声器播放。 实验准备 实验元件 扬声器、麦克风 元件特性 K210 开发板的麦克风同样是使用 I2S 传输数据,只不过麦克风使用的是 I2S…...
操作系统-锁/内存/中断/IO
文章目录 锁自旋锁互斥锁悲观锁和乐观锁 内存管理物理/虚拟内存页表段表虚拟内存布局写时复制copy on writebrk,mmap页面置换算法 中断中断分类中断流程 网络I/OI/O模型服务器处理并发请求 锁 自旋锁 自旋锁是一种基于忙等待(Busy-Waiting)…...
割点与其例题
割点 定义: 若一个点在图中被去掉后,图的连通块个数增加,那么这个点就被称为“割点”。如下图所示红点。 定义说白了就是若去掉一个点,图被“断开”的点称为割点。 朴素算法: 枚举每个点 u。遍历图,如果…...
CSS实现文本自动平衡text-wrap: balance
不再有排版孤行和寡行 我们都知道那些标题,最后一个单词换行并单独站在新行上,破坏了视觉效果,看起来很奇怪。当然,有老式的 手动换行或将内容分成不同部分。但您听说过text-wrap: balance吗? 通过应用text-wrap: bal…...
【未完】【GNN笔记】EvolveGCN:Evolving Graph Convolutional Networks for Dynamics Graphs
Evolving Graph Convolutional Networks for Dynamics Graphs 视频链接:《图神经网络》 相关系列: 《Dynamic Graph的分类》《动态图网络之Dynamic Self-Attention Network》 文章目录 Evolving Graph Convolutional Networks for Dynamics Graphs一、…...
【愚公系列】《Manus极简入门》042-投资策略分析师:“投资智慧导航”
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! …...
《AI大模型应知应会100篇》第65篇:基于大模型的文档问答系统实现
第65篇:基于大模型的文档问答系统实现 📚 摘要:本文详解如何构建一个基于大语言模型(LLM)的文档问答系统,支持用户上传 PDF 或 Word 文档,并根据其内容进行智能问答。从文档解析、向量化、存储到…...
P1439 【模板】最长公共子序列
P1439 【模板】最长公共子序列 - 洛谷 题目描述 给出1, 2, …, n的两个排列P1和P2,求它们的最长公共子序列。 输入格式 第一行是一个数n。 接下来两行,每行为n个数,为自然数1, 2, …, n的一个排列。 输出格式 一个数,即…...
LLaMA-Factory:环境准备
一、硬件和系统 操作系统: Ubuntu 24.04.2 LTS(64位)GPU: NVIDIA RTX 4090 笔记本 GPU,16GB显存CPU: 建议高性能多核 CPU(如 Intel i7/i9 或 AMD Ryzen 7/9)以支持数据预处理,我的是32核。RAM: 至少 32GB&…...
polarctf-web-[rce1]
考点: (1)RCE(exec函数) (2)空格绕过 (3)执行函数(exec函数) (4)闭合(ping命令闭合) 题目来源:Polarctf-web-[rce1] 解题: 这段代码实现了一个简单的 Ping 测试工具,用户可以通过表单提交一个 IP 地址,服务器会执…...
AI实践用例---日程规划(通用日程管理文件ICS)灵感踩坑日常
我是一位践行独立开发者之路的菜鸟开发者。 由于执行力较差,常常有很多想法但是很多时候没有去践行。 所以我有了让大模型为我生成日程安排的想法,这确实可以,很简单。只需要将你的想法告诉ai就行了。 例如: 发给AI的提示词: 我想你帮我对,嗯,未来的一年做一个嗯,大…...
MySQL 8.0 OCP 1Z0-908 121-130题
Q121.Examine these statements and output: mysql> GRANT PROXY ON accountinglocalhost TO ’ ‘ ‘%’; mysql> SELECT USER(), CURRENT_USER(), proxy_user; --------------------------------------------------------- |USER() | CURRENT_USER() | proxy_user I | …...
InfluxDB 2.7 连续查询实战指南:Task 替代方案详解
InfluxDB 2.7 引入了 Task 功能,作为连续查询(CQ)的现代替代方案。本文详细介绍了如何使用 Task 实现传统 CQ 的功能,包括语法解析、示例代码、参数对比以及典型应用场景。通过实际案例和最佳实践,帮助开发者高效迁移并…...
计算机网络 : Socket编程
计算机网络 : Socket编程 目录 计算机网络 : Socket编程引言1.UDP网络编程1.1 网络地址与端口转换函数1.2 本地环回1.3 EchoServer1.4 DictServer1.5 DictServer封装版1.6 简单聊天室 2.TCP网络编程2.1 TCP Socket API详解2.2 Echo Server2.3 Echo Serve…...
C++动态内存分配
内存管理 1.代码段(Code Segment / Text Segment)常量区2. 数据段(Data Segment)静态区3. BSS 段(未初始化数据段)4. 堆(Heap)5. 栈(Stack)6. 内存映射段&…...
git版本控制学习
1.环境搭配 2.Linux常用指令 cd:更改目录cd..回到上一级目录pow:显示当前所在的目录路径li(||):列出当前目录所有文件,只不过||例出的内容更为详细touch:新建一个文件夹如touch index.js就会在当前目录下新建一个index.js文件rm:删除一个文件,rm index.js 就会把in…...
在MYSQL中导入cookbook.sql文件
参考资料: GitHub 项目:svetasmirnova/mysqlcookbook CSDN 博客:https://blog.csdn.net/u011868279/category_11645577.html 建库: mysql> use mysql Reading table information for completion of table and column names …...
安科瑞AcrelEMS3.0企业微电网智慧能源平台-安科瑞 蒋静
1、平台介绍 Acrel-EMS3.0 智慧能源平台是针对企业微电网的能效管理平台,满足江苏省《新型电力负荷管理系统数据接入规范》的技术架构,可通过云云互联方式接受电力平台的调度指令和策略下发,支持作为微网调度子系统或子平台。 2、解决方案 …...
5G-A和未来6G技术下的操作系统与移动设备变革:云端化与轻量化的发展趋势
目录 5G技术带来的革命性变革 云端化操作系统的实现路径 完全云端化模式 过渡性解决方案 未来操作系统的发展方向 功能架构演进 安全机制强化 移动设备的形态变革 终端设备轻量化 物联网设备简化 实施挑战与应对策略 技术挑战 商业模式创新 总结与展望 5G技术作为…...