【Rust】Rust中的枚举与模式匹配,原理解析与应用实战
✨✨ 欢迎大家来到景天科技苑✨✨
🎈🎈 养成好习惯,先赞后看哦~🎈🎈
🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Rust开发,Python全栈,Golang开发,云原生开发,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。所属的专栏:Rust语言通关之路
景天的主页:景天科技苑
文章目录
- Rust枚举与模式匹配
- 1、定义枚举
- 1.1 类似C语言的定义方式
- 1.2 Rust语言提倡的方式
- 2、match 控制流运算符
- 2.1 基本语法
- 2.2 基本示例
- 2.3 匹配枚举
- 2.4 绑定值
- 2.5 模式匹配
- 2.6 范围匹配
- 2.7 守卫条件
- 2.8 _ 通配符
- 3、Option
- 3.1 简单匹配
- 3.2 解构 Some 中的值
- 3.3 处理函数返回的Option
- 3.4 多层嵌套的 Option 处理
- 3.5 忽略 Some 中的值
- 3.6 提供默认值
- 4、if let 简单控制流
Rust枚举与模式匹配
枚举(enumerations),也被称作 enums。枚举允许你通过列举可能的值来定义一个类型。首先,我们会定义并使用一个枚举来展示它是如何连同数据一起编码信息的。接下来,我们会探索一个特别有用的枚举,叫做 Option ,它代表一个值要么是某个值,要么什么都不是。然后会讲到在 match 表达式中用模式匹配,针对不同的枚举值编写相应要执行的代码。
最后会涉及到 if let ,另一个简洁方便处理代码中枚举的结构。
枚举是一个很多语言都有的功能,不过不同语言中其功能各不相同。
Rust 的枚举与 F#、OCaml 和 Haskell 这样的函数式编程语言中的 代数数据类型(algebraic data types)最为相似。
1、定义枚举
让我们看看一个需要诉诸于代码的场景,来考虑为何此时使用枚举更为合适且实用。
假设我们要处理 IP 地址。目前被广泛使用的两个主要 IP 标准:IPv4(version four)和 IPv6(version six)。
这是我们的程序可能会遇到的所有可能的 IP 地址类型:所以可以 枚举 出所有可能的值,这也正是此枚举名字的由来。
任何一个 IP 地址要么是 IPv4 的要么是 IPv6 的,而且不能两者都是。IP 地址的这个特性使得枚举数据结构非常适合这个
场景,因为枚举值只可能是其中一个成员。IPv4 和 IPv6 从根本上讲仍是 IP 地址,所以当代码在处理适用于任何类型的
IP 地址的场景时应该把它们当作相同的类型。
定义枚举语法: enum 枚举名称 { 字段 }
1.1 类似C语言的定义方式
fn main() {//定义枚举,加上debug用来打印枚举值#[derive(Debug)]enum IpAddrKind {V4,V6,}//定义结构体,使用枚举#[derive(Debug)]struct NewIpAddr {kind: IpAddrKind,address: String,}//实例化结构体let p1 = NewIpAddr {//使用枚举,枚举名::枚举字段kind: IpAddrKind::V4,address: String::from("10.10.0.10"),};let p2 = NewIpAddr {kind: IpAddrKind::V6,address: String::from("::1"),};//打印结构体println!("p1: {:?}", p1);println!("p2: {:?}", p2);
}
1.2 Rust语言提倡的方式
上面C语言方式定义枚举,枚举字段没定义类型。Rust提倡的方式定义枚举,可以直接在定义枚举字段的时候,定义好字段类型
fn main() {//Rust提倡的定义枚举方式#[derive(Debug)]enum IpAddr {V4(String),V6(String),}//实例化枚举let p1 = IpAddr::V4(String::from("127.0.0.1"));let p2 = IpAddr::V6(String::from("::1"));//打印枚举println!("p1: {:?}", p1);println!("p2: {:?}", p2);
}
IpAddr 枚举的新定义表明了 V4 和 V6 成员都关联了 String 值
我们直接将数据附加到枚举的每个成员上,这样就不需要一个额外的结构体了。
枚举值也可以是不同类型
V4 地址储存为四个 u8 值而 V6 地址仍然表现为一个 String
//枚举值可以是不同类型
#[derive(Debug)]
enum IpAddrKind {V4(u8, u8, u8, u8),V6(String),
}
//实例化枚举
let p3 = IpAddrKind::V4(127, 0, 0, 1);
let p4 = IpAddrKind::V6(String::from("::1"));
//打印枚举
println!("p3: {:?}", p3);
println!("p4: {:?}", p4);
枚举的经典用法
枚举的成员中内嵌了多种多样的类型
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(i32, i32, i32),
}
一个 Message 枚举,其每个成员都储存了不同数量和类型的值
这个枚举有四个含有不同类型的成员:
Quit 没有关联任何数据。
Move 包含一个匿名结构体
Write 包含单独一个 String 。
ChangeColor 包含三个 i32 。
枚举类似于定义不同类型的结构体,除了枚举不使用 struct 关键字并且所有成员都被组合在一起位于 Message 下之外。
如下这些结构体可以包含与之前枚举成员中相同的数据:
struct QuitMessage; // unit struct
struct MoveMessage {x: i32,y: i32,
}
struct WriteMessage(String); // tuple struct
struct ChangeColorMessage(i32, i32, i32); // tuple struct
不过如果我们使用不同的结构体,它们都有不同的类型,将不能轻易的定义一个获取任何这些信息类型的函数
结构体和枚举还有另一个相似点:就像可以使用 impl 来为结构体定义方法那样,也可以在枚举上定义方法。
这是一个定义于我们 Message 枚举上的叫做 call 的方法:
enum Message {Quit,Move {x: i32,y: i32,},Write(String),ChangeColor(i32, i32, i32),
}impl Message {fn call(&self) {// method body would be defined hereprintln!("call");}
}
let m = Message::Write(String::from("hello"));
m.call();
可以实例化枚举中的一个或多个值,调用枚举的方法
方法体使用了 self 来获取调用方法的值。这个例子中,创建了一个拥有类型 Message::Write(“hello”) 的变量 m ,而且这就是当 m.call() 运行时 call 方法。
2、match 控制流运算符
Rust 有一个叫做 match 的极为强大的控制流运算符,match 类似于其他语言中的 switch 语句,但更加强大和安全。
它允许我们将一个值与一系列的模式相比较并根据相匹配的模式执行相应代码。
模式可由字面值、变量、通配符和许多其他内容构成;
match 的力量来源于模式的表现力以及编译器检查,它确保了所有可能的情况都得到处理。
2.1 基本语法
match value {pattern1 => expression1,pattern2 => expression2,// ..._ => default_expression,
}
match后面跟要匹配的表达式,穷举模式的各种pattern。=> 运算符将模式和将要运行的代码分开。每一个分支之间使用逗号分隔
当 match 表达式执行时,它将结果值按顺序与每一个分支的模式相比较,如果模式匹配了这个值,这个模式相关联的代码将被执行,后面的模式就不再去匹配。
如果模式并不匹配这个值,将继续执行下一个分支。
每个分支相关联的代码是一个表达式,而表达式的结果值将作为整个 match 表达式的返回值。
2.2 基本示例
let number = 3;match number {1 => println!("One"),2 => println!("Two"),3 => println!("Three"), // 这里会匹配_ => println!("Other"), // 通配模式,匹配所有其他情况
}
2.3 匹配枚举
match 在处理枚举时特别有用:
案例一:
enum Message {Quit,Move {x: i32,y: i32,},Write(String),ChangeColor(i32, i32, i32),
}impl Message {//枚举的方法fn call(&self) {// method body would be defined here// * 解引用。match类似switchmatch *self {Message::Quit => println!("Quit"),Message::Move { x, y } => println!("Move to x: {}, y: {}", x, y),Message::Write(ref text) => println!("Text message: {}", text),Message::ChangeColor(r, g, b) =>println!("Change color to r: {}, g: {}, b: {}", r, g, b),}}
}let quit = Message::Quit;
quit.call();let m = Message::Write(String::from("hello"));
m.call();let mymove = Message::Move { x: 10, y: 20 };
mymove.call();let change_color = Message::ChangeColor(255, 0, 0);
change_color.call();
案例二:
enum Direction {Up,Down,Left,Right,
}let dir = Direction::Left;match dir {Direction::Up => println!("Going up"),Direction::Down => println!("Going down"),Direction::Left => println!("Going left"),Direction::Right => println!("Going right"),
}
2.4 绑定值
匹配分支的另一个有用的功能是可以绑定匹配的模式的部分值。这也就是如何从枚举成员中提取值的。
可以在匹配时将值绑定到变量:
enum Message {Quit,Move { x: i32, y: i32 },Write(String),
}let msg = Message::Move { x: 10, y: 20 };match msg {Message::Quit => println!("Quit"),Message::Move { x, y } => println!("Move to x: {}, y: {}", x, y),Message::Write(text) => println!("Text message: {}", text),
}
2.5 模式匹配
Rust 的 match 支持多种模式匹配:
let pair = (0, -2);match pair {(0, y) => println!("First is 0, y is {}", y),(x, 0) => println!("x is {}, second is 0", x),_ => println!("Other"),
}
2.6 范围匹配
let age = 25;match age {0..=12 => println!("Child"),13..=19 => println!("Teenager"),20..=64 => println!("Adult"),_ => println!("Senior"),
}
2.7 守卫条件
可以在模式后添加 if 条件:
let num = Some(4);match num {Some(x) if x < 5 => println!("Less than five: {}", x),Some(x) => println!("{}", x),None => (),
}
2.8 _ 通配符
_ 通配符类似switch里面的default。
Rust 也提供了一个模式用于不想列举出所有可能值的场景。例如, u8 可以拥有 0 到 255 的有效的值,如果我们只关心
1、3、5 和 7 这几个值,就并不想必须列出 0、2、4、6、8、9 一直到 255 的值。所幸我们不必这么做:可以使用特殊的模式 _ 替代
_ 模式会匹配所有的值。通过将其放置于其他分支之后, _ 将会匹配所有之前没有指定的可能的值。 () 就是 unit值,所以 _ 的情况什么也不会发生。
因此,可以说我们想要对 _ 通配符之前没有列出的所有可能的值不做任何处理。
前面所有的模式都匹配补上,走 _ 这个通配符模式
let some_u8_value = 0u8;
match some_u8_value {1 => println!("one"),3 => println!("three"),5 => println!("five"),7 => println!("seven"),_ => (),
}
3、Option
Option 是 Rust 标准库中定义的一个非常重要的枚举类型,用于表示一个值可能存在(Some)或不存在(None)。
Option 要么返回的是Some(),要么返回的是None
使用 match 来处理 Option 是 Rust 中常见的模式。
Option 基本定义
enum Option<T> {Some(T),None,
}
T表示泛型的类型
Rust中的空一般会结合Option这个枚举类型来表示,变愉快控制程序的bug
Rust 中的匹配是 穷尽的(exhaustive):必须穷举
到最后的可能性来使代码有效。特别的在这个 Option 的例子中,Rust 防止我们忘记明确的处理 None 的情况,
这使我们免于假设拥有一个实际上为空的值,这造成了价值亿万的错误。
基本匹配模式
3.1 简单匹配
let some_number = Some(5); //这里的5,系统可以自动推导泛型类型为i32
let none_number: Option<i32> = None;//模式匹配
match some_number {Some(i) => println!("Got a number: {}", i),None => println!("Got nothing"),
}match none_number {Some(i) => println!("Got a number: {}", i),None => println!("Got nothing"), // 这里会匹配
}
注意:以下两个数是不同的类型,x是i32类型,y是Option枚举类型
let x: i32 =5;
let y: Option = Some(5);
3.2 解构 Some 中的值
let some_string = Some("hello".to_string());match some_string {Some(s) => println!("Got a string: {}", s),None => println!("Got no string"),
}
3.3 处理函数返回的Option
//处理函数返回的Option
fn divide(numerator: f64, denominator: f64) -> Option<f64> {if denominator == 0.0 { None } else { Some(numerator / denominator) }
}let result = divide(10.0, 2.0);match result {Some(x) => println!("Result: {}", x),None => println!("Cannot divide by zero"),
}
3.4 多层嵌套的 Option 处理
let nested_option = Some(Some(42));match nested_option {Some(Some(value)) => println!("Double wrapped value: {}", value),Some(None) => println!("Inner is None"),None => println!("Outer is None"),
}
3.5 忽略 Some 中的值
some(_), 不管some中值为多少,都会匹配到
let option_val = Some(7);match option_val {Some(_) => println!("Got something but don't care about the value"),None => println!("Got nothing"),
}
3.6 提供默认值
let maybe_number: Option<i32> = None;
let number = match maybe_number {Some(n) => n,None => 0, // 默认值
};
println!("Number is: {}", number);
4、if let 简单控制流
虽然 match 是最全面的处理方式,但是我们有时候不想处理匹配不到的其他值或None,这是就可以使用if let 这种更短的方式编写
if let 语法让我们以一种不那么冗长的方式结合 if 和 let ,来处理只匹配一个模式的值而忽略其他模式的情况。
可以认为 if let 是 match 的一个语法糖,它当值匹配某一模式时执行代码而忽略所有其他值。
用法: if let Some(v) = 需要判断的Option
可以使用多个if let,用来判断
//if let语法
let some_u8_value = Some(3u8);
if let Some(2) = some_u8_value {println!("three");
} else if let Some(3) = some_u8_value {println!("three");
} else if let Some(4) = some_u8_value {println!("four");
} else {println!("other");
}
相关文章:
【Rust】Rust中的枚举与模式匹配,原理解析与应用实战
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...
【CUDA 编译 bug】ld: cannot find -lcudart
我们使用 Conda 安装 pytorch 和 CUDA 环境之后,要用 Conda 的CUDA环境进行某个库编译时,出现了bug: /mnt/data/home/xxxx/miniforge3/envs/GAGAvatar/compiler_compat/ld: cannot find -lcudart: No such file or directorycollect2: error…...
MYSQL之数据类型
数据类型分类 数值类型 在MySQL中, 整型可以指定是有符号的和无符号的, 默认是有符号的. 可以通过 UNSIGNED 来说明某个字段是无符号的. tinyint类型 以tinyint为例, 其它的整型类型都只是数据范围的区别. 数据越界 创建一个 tinyint 类型的 num 的属性, 大小为 1 字节, 不…...
Asp.Net Core 异常筛选器ExceptionFilter
文章目录 前言一、异常筛选器的核心概念用途:实现接口:执行时机: 二、使用步骤1.创建自定义异常筛选器2.注册异常筛选器全局注册(对所有 Controller 生效):局部注册(通过特性标记特定的 **Contr…...
WebUI可视化:第2章:技术基础准备
学习目标 ✅ 掌握HTML/CSS基础语法 ✅ 理解JavaScript核心功能 ✅ 了解前后端交互原理 2.1 HTML基础:网页的骨架 2.1.1 基础结构 每个HTML文件都必须包含以下基本结构: html <!DOCTYPE html> <html> <head><title>我的第一个网页</title> …...
Java基础集合 面试经典八股总结 [连载ing]
序言 八股,怎么说呢。我之前系统学习的内容,进行梳理。通过问题的方式,表达出得当的内容,这件事本身就很难。面试时心态、状态、掌握知识的情况等。关于八股文,我不想有太多死记硬背的内容,更多的是希望自我…...
大数据运维面试题
华为大数据运维面试题可能涵盖多个方面,以下是一些可能的面试问题及解析,这些问题旨在考察应聘者的技术知识、问题解决能力和对大数据运维的理解: 一、技术知识类问题 简述大数据运维的主要职责和工作内容 回答示例:大数据运维工…...
OpenBMC:BmcWeb login认证
BmcWeb在include\login_routes.hpp中实现了/login用于完成web的登录: BMCWEB_ROUTE(app, "/login").methods(boost::beast::http::verb::post)(handleLogin);inline void handleLogin(const crow::Request& req,const std::shared_ptr<bmcweb::AsyncResp>…...
Python学习之路(五)-接口API
在 Python 中结合数据库开发接口 API 通常使用 Web 框架(如 Flask 或 Django)和 ORM(对象关系映射)工具(如 SQLAlchemy 或 Django ORM)。以下是使用 Flask 和 SQLAlchemy 的详细步骤,展示如何结合数据库开发一个简单的 API。 使用 Flask 和 SQLAlchemy 开发 API 1. 安…...
数据库+Docker+SSH三合一!深度评测HexHub的全栈开发体验
作为一名技术博主,我最近一直被各种开发工具切换搞得焦头烂额。数据库要用Navicat,服务器管理得开Termius,Docker操作还得切到命令行,每天光在不同工具间切换就浪费了大量时间。直到团队里的一位架构师向我推荐了HexHub这个一体化…...
涂料油墨制造数字化转型的关键技术与挑战
涂料油墨制造行业正处于数字化转型的关键时期,这一转型是提升生产效率、增强产品质量和降低成本的重要途径。以下是该行业在数字化转型中的关键技术与面临的挑战: 关键技术: 工业互联网技术:通过在生产设备上安装传感器…...
UE5 调整字体、界面大小
文章目录 方案一 5.4 版本及以上(推荐)方案二 5.3 版本及以下(推荐)方案三 使用插件(不推荐) 方案一 5.4 版本及以上(推荐) 进入 编辑 > 编辑器偏好设置,如下图所示&…...
【OpenCV图像处理实战】从基础操作到工业级应用
目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心代码实现(6个案例)案例1:图像基本操作案例2:边缘检测案例3&…...
生成随机验证码-解析与优化
文章目录 代码功能解析潜在问题与优化建议1. 安全性问题2. 易混淆字符过滤3. 参数校验4. 性能优化 扩展功能示例1. 自定义字符集2. 批量生成验证码 完整优化代码关键总结 代码功能解析 import random import stringdef generate_code(length6):chars string.digits string.a…...
VMware 虚拟机镜像资源网站
常见的 VMware 虚拟机镜像资源网站 网站名称链接地址特点OSBoxes.orgOSBoxes - Virtual Machines for VirtualBox & VMware 提供 .vmx .vmdk,适合 VMware 和 VirtualBox,更新频率高,界面清晰LinuxVMImages.comLinux VM Images - Downlo…...
HTML5 详细学习笔记
1. HTML5 简介 HTML5 是最新的 HTML 标准,于 2014 年 10 月由 W3C 完成标准制定。它增加了许多新特性,包括语义化标签、多媒体支持、图形效果、离线存储等。 1.1 HTML5 文档基本结构 <!DOCTYPE html> <html lang"zh-CN"> <h…...
真.从“零”搞 VSCode+STM32CubeMx+C <1>构建
目录 前言 准备工作 创建STM32CubeMx项目 VSCode导入项目&配置 构建错误调试 后记 前言 去年10月开始接触单片机,一直在用树莓派的Pico,之前一直用Micropython,玩的不亦乐乎,试错阶段优势明显,很快就能鼓捣一…...
Pikachu靶场
本质是信任了不可信的客户端输入。防御核心: 永不信任客户端提交的权限参数(如 user_id, role)。强制服务端校验用户身份与操作权限。定期审计权限模型,避免业务迭代引入新漏洞。 水平越权 1,按照网站的提示要求登录 进…...
五、web自动化测试01
目录 一、HTML基础1、HTML介绍2、常用标签3、基础案例3.1 前端代码3.2 自动化测试 二、CSS定位1、css介绍2、案例3、代码优化 三、表单自动化1、案例2、元素属性定位 四、后台基础数据自动化1、登录1.1 id与class定位1.2 定位一组元素 2、商品新增 一、HTML基础 可参考学习 链…...
利用软件I2C驱动OLED,点亮、熄灭OLED屏幕以及获取当前OLED屏幕开启状态
题目: 参考《I2C通信》的文档,自行连接电路,利用软件I2C驱动OLED,点亮、熄灭OLED屏幕以及获取当前OLED屏幕开启状态。 可以优先实现: 软件I2C初始化函数,用于初始化IO引脚 再实现: 主机发起始位和停止位,主机发送1个字节,…...
数据结构——栈与队列
1.栈 1.1概念 一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。 栈中的数据元素遵守后进先出 LIFO ( Last In First Out )的原则。 压栈:栈…...
【嵌入式系统设计师(软考中级)】第二章:嵌入式系统硬件基础知识(3)
文章目录 4. 嵌入式系统I/O接口4.1 GPIO与PWM接口4.1.1 GPIO接口(General-Purpose Input/Output)4.1.2 PWM接口(Pulse Width Modulation) 4.2 A/D与D/A接口的基本原理与结构4.2.1 DA转换(数模转换,Digital-…...
【网络安全】社会工程学策略
1. 社会工程学简介 社会工程攻击是威胁行为者常用的攻击方式。这是因为,诱骗人们提供访问权限、信息或金钱通常比利用软件或网络漏洞更容易。 您可能还记得,社会工程学是一种利用人为错误来获取私人信息、访问权限或贵重物品的操纵技术。它是一个涵盖性…...
ROS2---时间戳对齐
一、ROS2时间系统架构 时间模型 仿真时间(Simulation Time):由/clock话题驱动,适用于离线仿真与调试。真实时间(Real Time):基于系统硬件时钟,支持PTP协议(IEEE 1588&…...
C语言教程(十五):C 语言函数指针与回调函数详解
一、函数指针 1.1 函数指针的概念 在 C 语言中,函数指针是指向函数的指针变量。每个函数在内存中都有一个起始地址,函数指针就存储了这个起始地址,通过函数指针可以调用相应的函数。 1.2 函数指针的定义 函数指针的定义语法如下:返…...
VSCode如何修改默认扩展路径和用户文件夹目录到其他盘以及微信开发工具如何修改扩展路径到其他盘
ps:因公司电脑c盘内存严重不足,而出本篇文章 1.Visual Studio Code 随着VsCode的使用时间的推移,安装的扩展以及数据逐步增多,导致c盘内存占用较大,所以这里将vscode的默认缓存路径等迁移到其他盘。 步骤如下 1.找到默认的存储…...
抽象类相关
抽象类的定义 抽象类 是一种特殊的类,它不能被实例化,只能作为基类来派生出具体类。抽象类至少包含一个纯虚函数 。纯虚函数是在函数原型前加上 0 的虚函数,表示该函数没有具体实现,必须由派生类来实现。 抽象类的作用 提供统…...
如何测试短信接口
目录 一、测试短信接口的基本流程 1. 了解短信接口文档 2. 使用工具测试短信接口 示例一:用 curl 测试 POST 请求 示例二:用 Postman 设置 POST 请求 3. 编写测试脚本(Python 示例) 二、测试类型和场景 ✅ 正常发送测试 …...
pycharm2024.3.2项目解释器选择问题
问题描述:已经选择了pyau虚拟环境的解释器,运行了conda activate pyau,但是为什么关闭pycharm2024.3.2软件重新启动后,打开终端是(base) PS D:\deepseektest> ,为什么不是(pyau) PS D:\deepseektest> 解决问题&a…...
如何在 Dialog 中安全初始化 ECharts 并自动监听容器大小变化
如何在 Dialog 中安全初始化 ECharts 并自动监听容器大小变化 在使用 ECharts 的 Vue 项目中,我们常常会将图表放入弹窗(如 Element UI 的 <el-dialog>)中进行展示。但你是否遇到过以下问题: 图表初次显示尺寸异常&#x…...
如何借助ETL数据集成工具实现数据一致性?
主要可以从以下几个方面入手: 一、数据抽取阶段(Extract) 统一数据源连接方式:ETL工具通常支持多种数据源连接方式,如关系型数据库、非关系型数据库、文件系统、API接口等。在抽取数据时,要确保对各个数据…...
3.4/Q1,GBD数据库最新文章解读
文章题目:Burden of Carbon Monoxide Poisoning in Asian Countries From 1990 to 2021 and Its Projection Until 2030: An Analysis of the Global Burden of Disease Study 2021 DOI:10.2147/CLEP.S512786 中文标题:1990 年至 2021 年亚洲…...
【高中数学/古典概率】4红2黑六选二,求取出两次都是红球的概率
【问题】 袋子里装4只红球,2只黑球,大小完全相同,抽两次球,每次抽一只,抽出后不再放回,求取出的两次都是红球的概率。 【来源】 数林外传系列之《概率与期望》P20 单埻著 中国科学技术大学出版社 【数学…...
机器人操作中的生成式 AI:综述(上)
25年3月来自香港大学、香港理工、香港科大、浙大和清华大学的论文“Generative Artificial Intelligence in Robotic Manipulation: A Survey”。 本综述全面回顾机器人操作领域生成学习模型的最新进展,并探讨该领域的关键挑战。机器人操作面临着关键瓶颈ÿ…...
Spring AI 核心概念
本文是对Spring AI中涉及到的AI相关核心概念的介绍,笔者结合LangChain、LlamaIndex的使用经验,尝试尽可能清晰的把这些概念解释清楚. 读者也可以参考官方文档作为补充. 模型 提到AI模型,我们的第一印象一定是GPT,DeepSeek这样的大语言模型(…...
第53.5讲 | 小项目实战:用 SHAP 值解释农作物产量预测模型 [特殊字符][特殊字符]
目录 ✅ 项目背景 📦 所用工具 📁 数据字段(模拟) 🧑💻 代码实现步骤 🎯 解读与启发 🧠 项目拓展建议 ✅ 项目背景 我们使用一个简化的玉米产量数据集(可模拟实…...
Linux编译器-gcc/g++使用
1.预处理(进行宏替换) -E开始进行程序编译,在预处理做完的时候,停下来 2.编译(生成汇编) -S 开始编译,编译做完了就停下来 3.汇编(生成机器可识别代码) -c 开始翻译汇编…...
SEO的关键词研究与优化 第二章
回顾上一篇文章, 3. 关键词评估和选择 关键词评估和选择是SEO策略中至关重要的一步。这个过程不仅仅是选择搜索量最高的词,而是要在多个因素之间找到平衡,以确定最有价值的关键词。 3.1 搜索量分析 搜索量是评估关键词潜力的首要指标,但它不应…...
数据结构数组
数组特点 内存是连续的,所以地址可以偏移,支持下标访问。 优点 下标访问(随机访问)的时间复杂度是O(1),末尾增加和删除元素的时间复杂度是O(1)。 访问元素前后相邻位置方便,因为数组每个位置内存是连续的ÿ…...
vscode插件系列-2、认识vscode
这一章,我将带你重新认识vscode 一、工作区划分 1、活动条(Activity Bar) 活动条是一个核心的导航,扩展可以通过在View Containers中配置,从而渲染Views中的视图。 具体来说就是在package.json中配置如下&…...
Java学习手册:TCP 协议基础
一、TCP 协议概述 TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,它在 IP 协议的基础上提供了可靠的 数据传输服务。TCP 通过三次握手建立连接,通过四次挥手…...
摘要 | 李录在北大光华管理学院的演讲《价值投资》
李录在北大光华管理学院的演讲《价值投资》是中文投资领域极具影响力的经典内容,尤其是2019年11月的演讲版本。该演讲视频时长90分钟,主要内容围绕价值投资的理论框架、实践难点以及在中国市场的应用展开。以下是该演讲的核心要点解析: 一、价…...
让Docker端口映射受Firewall管理而非iptables
要让Docker容器的端口映射受系统防火墙(如firewalld或ufw)管理,而不是直接通过iptables,可以按照以下步骤配置: 方法一:禁用Docker的iptables规则 (1)编辑Docker配置文件: vi /etc/docker/da…...
数据库数据删除与修改实验
数据库数据删除与修改实验 在数据库原理的学习中,数据的删除与修改是核心操作技能。通过“删除修改数据”实验,我系统实践了 SQL 中 UPDATE 和 DELETE 语句的多种应用场景,从基础语法到复杂业务逻辑处理,积累了丰富的实战经验。本…...
多回路电表如何革新电力监控?安科瑞技术深度解析
安科瑞顾强 安科瑞电气股份有限公司作为国内领先的能源管理方案提供商,其多回路智能电表系列(如AMC200、AMC300L、ADW200-D10-4S等)凭借多回路计量、高精度测量、无线物联等核心优势,在工业、商业及智能电网领域广泛应用。以下从…...
【云计算】云计算中IaaS、PaaS、SaaS介绍
0 随着云计算、大数据、人工智能发展迅速,布局“云”已经是互联网企业共识。云计算的服务类型分为三种,分别为IaaS、PaaS、SaaS,这三个分别是什么意思,今天做一个简单的介绍和了解。 一、云计算 云计算是用户需求通过Internet获…...
Ubuntu中选择Python虚拟环境
背景 在Ubuntu系统中,如果希望通过一个简单的命令(例如activate)快速查找并激活Python虚拟环境,是可以通过Bash脚本实现的。该脚本的核心功能包括:递归扫描用户家目录(~)中所有非隐藏文件夹&am…...
Nginx 安装与配置全流程指南(2025 最新版)
一、环境准备与依赖安装 1.1 系统要求 操作系统:支持主流 Linux 发行版(Ubuntu 20.04/CentOS 7/Debian 10)硬件配置:内存 ≥512MB,磁盘 ≥10GB 可用空间(建议使用 SSD)网络要求:开…...
WAMP设置外网访问
系统:windows 软件:wampserver 设置允许外网访问 1.修改apache的httpd-vhosts.config # Virtual Hosts # <VirtualHost _default_:80>ServerName localhostServerAlias localhostDocumentRoot "${INSTALL_DIR}/www"<Directory "…...
NXP----SVR5510芯片layout设计总结
1,Pinout Information: VR5510是S32G应用处理器的拟议电源管理集成电路(PMIC)。它是一款汽车多输出PMIC,主要用于网关、ADAS、V2X和信息娱乐应用。下面的方框图展示了其主要特点。 2,封装设计&…...