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

Rust 学习笔记:枚举与模式匹配

Rust 学习笔记:枚举与模式匹配

  • Rust 学习笔记:枚举与模式匹配
    • 定义枚举(Enum)
    • 枚举变量
    • Option 枚举及其相对于 NULL 的优势
    • match 和枚举
    • 与 Option\<T\> 匹配
    • match 应该是详尽的
    • Catch-all 模式和 _ 占位符
    • 使用 if let 和 let else 简化控制流
    • let else 的高阶用法

Rust 学习笔记:枚举与模式匹配

在本文中,首先,我们将定义和使用枚举。接下来,我们将探讨一个特别有用的枚举,称为 Option。然后,我们将了解 match 表达式中的模式匹配。最后,我们将介绍 if let 构造。

定义枚举(Enum)

结构体提供了一种将相关字段和数据分组在一起的方法,而枚举则提供了一种说明一个值是一组可能值中的一个的方法。

任何 IP 地址都可以是 IPv4 或者 IPv6,但不能同时是这两个地址。IP 地址的这个属性使得枚举数据结构非常合适,因为枚举值只能是它的一个变体。

定义 IpAddrKind 枚举:

enum IpAddrKind {V4,V6,
}

IpAddrKind 是一个自定义数据类型。

枚举变量

我们可以像这样创建 IpAddrKind 的两个变体的实例:

    let four = IpAddrKind::V4;let six = IpAddrKind::V6;

注意,枚举的变体位于其标识符下的命名空间中,我们使用双冒号分隔两者。这是有用的,因为现在两个值 IpAddrKind::V4 和 IpAddrKind::V6 都是同一类型:IpAddrKind。

我们还可以定义一个接受任意 IpAddrKind 的函数:

fn route(ip_kind: IpAddrKind) {}

我们可以用任意一个变量调用这个函数:

    route(IpAddrKind::V4);route(IpAddrKind::V6);

枚举可以作为结构体的字段:

    enum IpAddrKind {V4,V6,}struct IpAddr {kind: IpAddrKind,address: String,}let home = IpAddr {kind: IpAddrKind::V4,address: String::from("127.0.0.1"),};let loopback = IpAddr {kind: IpAddrKind::V6,address: String::from("::1"),};

但是,仅使用枚举表示相同的概念更为简洁:我们可以将数据直接放入每个枚举变体中,而不是在结构体中使用枚举。这个枚举的新定义表明,V4 和 V6 的实例将具有相关的 String 值:

    enum IpAddr {V4(String),V6(String),}let home = IpAddr::V4(String::from("127.0.0.1"));let loopback = IpAddr::V6(String::from("::1"));

我们直接将数据附加到枚举的每个变体上,因此不需要额外的结构体。我们定义的每个枚举变体的名称也成为构造枚举实例的函数。也就是说,IpAddr::V4() 是一个函数调用,它接受一个 String 参数并返回一个 IpAddr 类型的实例。

使用 enum 而不是 struct 还有另一个好处:每个变量可以有不同的关联数据类型和数量。如果我们想要将 V4 地址存储为四个 u8 值,但仍然将 V6 地址表示为一个 String 值,那么我们将无法使用结构体。枚举可以轻松处理这种情况:

    enum IpAddr {V4(u8, u8, u8, u8),V6(String),}let home = IpAddr::V4(127, 0, 0, 1);let loopback = IpAddr::V6(String::from("::1"));

让我们来看看标准库是如何定义 IpAddr 的:两个不同结构体的形式将地址数据嵌入到变量中,每个变量的定义不同。

struct Ipv4Addr {// --snip--
}struct Ipv6Addr {// --snip--
}enum IpAddr {V4(Ipv4Addr),V6(Ipv6Addr),
}

注意,即使标准库包含了 IpAddr 的定义,我们仍然可以创建和使用我们自己的定义而不会产生冲突,因为我们没有将标准库的定义引入我们的作用域。

我们也可以使用 impl 在枚举上定义方法:

    impl Message {fn call(&self) {// method body would be defined here}}let m = Message::Write(String::from("hello"));m.call();

方法的主体会使用 self 来获取我们调用该方法的值。在这个例子中,我们创建了一个变量 m,它的值是 Message::Write(String::from(“hello”)),这就是 m.call() 运行时调用方法体中的 self 的值。

Option 枚举及其相对于 NULL 的优势

Option 是标准库定义的另一个枚举。Option 类型编码了一种非常常见的场景,在这种场景中,值可以是什么东西,也可以是空(什么都没有)。

Rust没有许多其他语言所具有的 null 特性。null 是一个表示没有值的值。在带有 null 的语言中,变量总是处于两种状态之一:null 或非 null。

空值的问题是,如果尝试将空值用作非空值,将得到某种错误。然而,null 试图表达的概念仍然是有用的:null 是由于某种原因当前无效或不存在的值。

问题不在于概念,而在于具体的实现。因此,Rust 没有空值,但它有一个枚举,可以编码值存在或不存在的概念。该 enum 为 Option<T>,由标准库定义如下:

enum Option<T> {None,Some(T),
}

可以直接使用 Some 和 None,而不使用 Option:: 前缀。Some(T) 和 None 是 Option<T> 类型的变体。

<T> 语法是 Rust 的一个我们还没有讨论的特性。它是一个泛型类型参数,意味着 Option 枚举的某些变体可以保存任何类型的数据。

示例:

    let some_number = Some(5);let some_char = Some('e');let absent_number: Option<i32> = None;

some_number 的类型为 Option<i32>,some_char 的类型是 Option<char>。对于 None,Rust 要求必须提供具体的 Option 类型。

当我们有一个 None 值时,在某种意义上它和 null 的意思是一样的:我们没有一个有效值。那么为什么 Option<T> 比 null 好呢?因为 Option<T> 和 T (T 可以是任何类型)是不同的类型。

例如,这段代码无法编译,因为它试图将 i8 添加到 Option<i8>:

    let x: i8 = 5;let y: Option<i8> = Some(5);let sum = x + y;

Rust 不理解如何添加 i8 和 Option<i8>,因为它们是不同的类型。

须先将 Option<T> 转换为 T,然后才能对其执行 T 操作。一般来说,这有助于抓住 null 最常见的问题之一:假设某些东西不是空的,而实际上是空的。为了拥有一个可能为空的值,必须显式地将该值的类型设置为 Option<T>。然后,当使用该值时,需要显式地处理该值为空的情况。只要值的类型不是 Option<T>,就可以放心地假设该值不为空。

这是 Rust 经过深思熟虑的设计决策,目的是限制 null 的普遍性,提高 Rust 代码的安全性。

match 和枚举

match 表达式是一个控制流结构,当与枚举一起使用时,它就是这样做的:它将运行不同的代码,这取决于它拥有的枚举的哪个变体,并且该代码可以使用匹配值中的数据。

我们可以编写一个函数,它接受一枚未知的美国硬币,并以与计数机类似的方式确定它是哪一枚硬币,并返回其以美分为单位的值:

enum Coin {Penny,Nickel,Dime,Quarter,
}fn value_in_cents(coin: Coin) -> u8 {match coin {Coin::Penny => {println!("Lucky penny!");1}Coin::Nickel => 5,Coin::Dime => 10,Coin::Quarter => 25,}
}

当匹配表达式执行时,它按顺序将结果值与每个模式进行比较。如果模式匹配该值,则执行与该模式关联的代码。如果该模式与值不匹配,则继续执行。

match 的的另一个有用特性是:它们可以绑定到与模式匹配的值部分。这就是从枚举变量中提取值的方法。

作为一个例子,让我们修改一个枚举变量,使其包含数据。

#[derive(Debug)] // so we can inspect the state in a minute
enum UsState {Alabama,Alaska,// --snip--
}enum Coin {Penny,Nickel,Dime,Quarter(UsState),
}

在这段代码的匹配表达式中,我们将一个名为 state 的变量添加到匹配变量 Coin::Quarter 值的模式中。当一个 Coin::Quarter 匹配时,状态变量将绑定到该 Quarter 的状态值。然后我们可以在代码中使用 state,如下所示:

fn value_in_cents(coin: Coin) -> u8 {match coin {Coin::Penny => 1,Coin::Nickel => 5,Coin::Dime => 10,Coin::Quarter(state) => {println!("State quarter from {state:?}!");25}}
}

如果我们调用 value_in_cents(Coin::Quarter(UsState::Alaska)),Coin 将是 Coin::Quarter(UsState::Alaska)。当我们将该值与每个匹配进行比较时,在到达 Coin::Quarter(state) 之前,它们都不匹配。此时,州的绑定将是值 UsState::Alaska。然后我们可以使用 println! 打印该值。

与 Option<T> 匹配

我们还可以使用 match 来处理 Option<T>。

编写一个函数,它接受 Option<i32>,如果里面有一个值,则将该值加 1。如果里面没有值,函数应该返回 None 值,并且不尝试执行任何操作。

    fn plus_one(x: Option<i32>) -> Option<i32> {match x {None => None,Some(i) => Some(i + 1),}}let five = Some(5);let six = plus_one(five);let none = plus_one(None);

match 应该是详尽的

match 中的模式必须涵盖所有可能性。

考虑一下这个版本的 plus_one 函数:

    fn plus_one(x: Option<i32>) -> Option<i32> {match x {Some(i) => Some(i + 1),}}

报错:error[E0004]: non-exhaustive patterns: `None` not covered。

我们没有处理 None 的情况,所以无法编译。

Rust 中的匹配是详尽的:为了使代码有效,我们必须穷尽每一种可能性。特别是在 Option<T> 的情况下,当 Rust 防止我们忘记显式处理 None 情况时,它保护我们避免在可能为 null 的情况下假设我们有一个值。

Catch-all 模式和 _ 占位符

使用枚举,我们还可以对一些特定的值采取特殊的操作,但对所有其他值采取默认操作。

    let dice_roll = 9;match dice_roll {3 => add_fancy_hat(),7 => remove_fancy_hat(),other => move_player(other),}fn add_fancy_hat() {}fn remove_fancy_hat() {}fn move_player(num_spaces: u8) {}

最后一个模式 other 将匹配所有没有明确列出的值,other 必须放在最后。

当我们想要捕获所有值,但又不想在捕获所有值的模式中使用值时可以使用 _。这是一个特殊的模式,它匹配任何值,并且不绑定到该值。这告诉 Rust 我们不打算使用这个值,所以 Rust 不会警告我们一个未使用的变量。

    let dice_roll = 9;match dice_roll {3 => add_fancy_hat(),7 => remove_fancy_hat(),_ => reroll(),}fn add_fancy_hat() {}fn remove_fancy_hat() {}fn reroll() {}

这个例子也满足穷竭性要求,因为我们显式地忽略了所有的其他值。

还可以有另外一种写法:

    let dice_roll = 9;match dice_roll {3 => add_fancy_hat(),7 => remove_fancy_hat(),_ => (),}fn add_fancy_hat() {}fn remove_fancy_hat() {}

使用 () 作为与 _ 匹配时的动作。这将告诉 Rust:不使用任何不匹配先前模式的值,并且不想在这种情况下运行任何代码。

使用 if let 和 let else 简化控制流

if let 语法以一种更简洁的方式来处理匹配一个模式的值,同时忽略其他模式。

    let config_max = Some(3u8);match config_max {Some(max) => println!("The maximum is configured to be {max}"),_ => (),}

如果值是 Some,我们通过将值绑定到模式中的变量 max 来打印出 Some 变量中的值。不对 None 值做任何事情。

每次都要写 _ => () 确实很烦,可以用 if let 语法进行简化:

    let config_max = Some(3u8);if let Some(max) = config_max {println!("The maximum is configured to be {max}");}

if let 的语法接受一个模式和一个用等号分隔的表达式。它的工作方式与匹配相同,将表达式提供给匹配,而模式是它的第一个臂。在本例中,模式是 Some(max),并且 max 绑定到 Some 内部的值。if let 块中的代码仅在值与模式匹配时运行。

使用 if let 意味着更少的输入、更少的缩进和更少的样板代码。但是,失去了 match 强制执行的详尽检查。

换句话说,可以将 if let 视为匹配的语法糖,当值匹配一个模式时运行代码,然后忽略所有其他值。

我们可以在 if 语句中包含 else 语句,该代码块相当于 if let 和 else。

match 写法:

    let mut count = 0;match coin {Coin::Quarter(state) => println!("State quarter from {state:?}!"),_ => count += 1,}

if let…else 写法:

    let mut count = 0;if let Coin::Quarter(state) = coin {println!("State quarter from {state:?}!");} else {count += 1;}

let else 的高阶用法

let else 语法在左侧接受一个模式,在右侧接受一个表达式(变量),这与 if let 非常相似,但它没有 if 分支,只有 else 分支。如果模式匹配,它将在外部作用域中绑定来自模式的值。如果模式不匹配,程序将进入 else。

一种常见的模式是当值存在时执行一些计算,否则返回默认值。

fn describe_state_quarter(coin: Coin) -> Option<String> {if let Coin::Quarter(state) = coin {if state.existed_in(1900) {Some(format!("{state:?} is pretty old, for America!"))} else {Some(format!("{state:?} is relatively new."))}} else {None}
}

我们还可以利用表达式生成的值来从 if let 中生成状态或提前返回。

用 if let 来写:

fn describe_state_quarter(coin: Coin) -> Option<String> {let state = if let Coin::Quarter(state) = coin {state} else {return None;};if state.existed_in(1900) {Some(format!("{state:?} is pretty old, for America!"))} else {Some(format!("{state:?} is relatively new."))}
}

用 let else 来写,会更简单:

fn describe_state_quarter(coin: Coin) -> Option<String> {let Coin::Quarter(state) = coin else {return None;};if state.existed_in(1900) {Some(format!("{state:?} is pretty old, for America!"))} else {Some(format!("{state:?} is relatively new."))}
}

相关文章:

Rust 学习笔记:枚举与模式匹配

Rust 学习笔记&#xff1a;枚举与模式匹配 Rust 学习笔记&#xff1a;枚举与模式匹配定义枚举&#xff08;Enum&#xff09;枚举变量Option 枚举及其相对于 NULL 的优势match 和枚举与 Option\<T\> 匹配match 应该是详尽的Catch-all 模式和 _ 占位符使用 if let 和 let e…...

UI自动化测试的优势

1. UI自动化测试的优势(提升效率的场景) ✅ 适合自动化的场景 (1) 高频回归测试 典型场景:每次版本迭代都要验证的核心功能(如登录、支付流程)。 效率提升:自动化脚本执行速度远高于手动测试,尤其适合敏捷开发中的快速验证。 (2) 跨平台/多环境测试 典型场景:需要在不…...

【Android】轻松实现实时FPS功能

文章目录 实时FPS 实时FPS 初始化 choreographer Choreographer.getInstance();lastFrameTimeNanos System.nanoTime();choreographer.postFrameCallback(frameCallback);监听并显示 Choreographer.FrameCallback frameCallback new Choreographer.FrameCallback() {Overri…...

BI平台是什么意思?一文讲清BI平台的具体应用!

目录 一、BI平台是什么意思 1. 基本概念 2. 核心功能 3. 重要性 二、BI平台的分类 1. 按部署方式分类 2. 按功能特点分类 3. 按行业应用分类 三、BI平台的使用场景 1. 销售与营销分析 2. 财务分析 3. 人力资源管理 4. 供应链管理 5. 运营管理 总结 “BI 平台是什…...

玩转MCP

玩转MCP 0.环境1.自定义stdio交互1.1.server1.2.client1.3.效果 2.自定义sse交互2.1.server2.2.client2.3.效果 3.使用官方文件 mcp火了好一阵了&#xff0c;最近一直在大院干活儿&#xff0c;好不容易抽出时间&#xff0c;赶紧来学习学习。 官方文档&#xff0c; mcp广场可以…...

2025华东杯A/B/C题解题思路+可运行代码参考

A题:跳台滑雪问题 选题分析: 跳台滑雪问题涉及物理学、运动学和优化算法。需要建立数学模型来分析运动员在不同阶段的最佳姿势和策略,以提高运动成绩。问题分为三个小问,分别是助滑坡姿势、空中飞行控制和着陆策略。 解题思路: 1. 助滑坡姿势: 分析助滑坡的物理特性,…...

IsaacLab最新2025教程(7)-创建Interactive Scene

在isaaclab中创建的强化学习训练环境有两种&#xff1a;direct workflow&#xff0c;风格与isaacgym一样。另外一种是manager-based workflow更加模块化&#xff0c;它主要是两部分包括仿真环境也就是即将介绍的interactive scene&#xff0c;与mdp的内容&#xff0c;比如奖励函…...

Linux远程管理

1.网络管理获取计算机的网络信息基本语法&#xff1a;windows ipconfig<img src"ReadMe.assets/image-20250318152355476.png" alt"image-20250318152355476" style"zoom:33%;" />powershell ifconfig 也可以通过上面的网络处获取powershe…...

双指针(4)——盛水最多的容器

题目&#xff1a; 这题可以暴力枚举&#xff0c;但会超时&#xff0c;所以我们要用其他方法。 我们就用示例1的数组为例&#xff0c;我们先取出一部分研究。 虽然我们不能用暴力枚举&#xff0c;但可以借用其思想。 对于6和4组成的容器&#xff0c;它可以储存24个单位的水。…...

sd webui 安装插件sd-webui-EasyPhoto依赖安装失败解决办法

在最新版的SD webui中&#xff0c;可以安装easyphoto插件&#xff0c;官方建议通过github安装&#xff0c;对无法科学上网的用户很不友好。对我自己来说是通过地址&#xff1a; https://gitee.com/wowai/sd-webui-EasyPhoto.git 分支&#xff1a;anyid 点击安装即可。 在安装…...

虚拟机对前端开发的实用价值:提升效率与解决痛点的完整指南

作为前端开发者&#xff0c;虚拟机可能不是你日常工作的核心工具&#xff0c;但它确实能在多个方面为前端开发提供强大支持。下面我将详细解析虚拟机如何帮助前端开发者提升工作效率、解决开发难题。 一、跨浏览器/跨平台测试环境搭建 1.1 多浏览器测试 真实IE测试&#xff…...

用Playwright自动化网页测试,不只是“点点点”

如果你接触过网页自动化测试&#xff0c;可能听说过 Selenium、Puppeteer 这些工具。但最近几年&#xff0c;一个新的开源项目在测试圈子里悄然兴起——它就是 Playwright 。 Playwright 是微软开发的一个自动化库&#xff0c;支持多种浏览器&#xff08;包括 Chrome、Firefox…...

合并两个有序数组

题目 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&#xff0c;合并…...

系统思考:局部最优与全局失衡

最近遇到一家创业公司的创始人&#xff0c;在复盘时说了一句扎心的话&#xff1a;“我们真的已经很努力了&#xff0c;大家每天都在拼&#xff0c;连周末都不休息……但事还是做不完&#xff0c;进展还是很慢。” 我和几个关键岗位员工聊了聊&#xff0c;他们也说&#xff1a;“…...

Windows 系统中安装 flash - attn

#工作记录 一、下载 flash_attn 在 Windows 系统中&#xff0c;直接使用 pip 在线安装 flash_attn 很可能失败。 建议从 kingbri1/flash-attention 的 GitHub 发布页面 下载与当前 Python、torch 和 CUDA 版本匹配的 .whl 文件&#xff0c;并从本地进行安装。 Linux版本&am…...

理想药用植物的特征综述-理想中药材”的系统定义-文献精读125

Decoding and designing: Promising routes to tailor-made herbs 解码与设计&#xff1a;定制化草药的潜力路径 摘要 理想药用植物的特征可归纳为高次生代谢产物含量、高抗逆性、理想的形态以及高产量。本研究提出了两种策略&#xff0c;用于解析中药活性成分的生物合成与质…...

Cline原理分析-prompt

Cline 抓包-prompt原文 You are Cline, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. TOOL USE You have access to a set of tools that are executed upon the user’s…...

allegro 怎样显示/隐藏铜皮shape?

1、setup–>User preferences&#xff1b; 2、Display -->shape_fill &#xff1b; 3、5个方框打“√”代表隐藏铜皮&#xff1b; 4、不打√代表显示铜皮;...

URP - 公告牌的效果实现

效果&#xff1a; 【太妃糖耶】我的最新作品&#xff0c;快来一睹为快&#xff01; 原理&#xff1a;使面片的正面永远跟随摄像机的旋转 首先我们可以了解一下顶点旋转的原理 B点是由原坐标系中的基向量和A点坐标值相乘得到的 当旋转此基向量后&#xff0c;B点的坐标值会发生…...

在VTK中使用VTKCamera

文章目录 概要Cpp代码概要 在VTK(Visualization Toolkit)中,vtkCamera 类用于控制三维场景中相机的视角。相机决定了你从哪个角度和位置观察三维场景。使用 vtkCamera 的一般步骤包括创建相机对象、配置相机参数、将相机设置为渲染器的活动相机,以及更新相机视图。 Cpp代…...

牛客:AB4 逆波兰表达式求值

链接&#xff1a;逆波兰表达式求值_牛客题霸_牛客网 题解&#xff1a; 利用栈&#xff0c;遍历字符串数组&#xff0c;遇到运算数则入栈&#xff0c;遇到运算符则取出栈顶两个运算数进行运算&#xff0c;并将运算结果入栈。 class Solution { public:/*** 代码中的类名、方法…...

Linux:文件操作

在C语言中&#xff0c;我们可以使用fopen() fclose() fread() fwrite()等接口进行文件操作&#xff0c;而由于文件是储存于磁盘中的&#xff0c;且磁盘是由操作系统来管理的&#xff0c;因此在用户层面对文件的操作必然要调用操作系统对文件的操作。 我们接下来就要了解操作系…...

Gin 集成 prometheus 客户端实现注册和暴露指标

在 Gin 框架中集成 Prometheus 监控系统&#xff0c;可以帮助开发者实时收集和展示应用程序的性能指标&#xff0c;便于监控和故障排查。 Prometheus 是一个开源的监控和告警系统&#xff0c;最初由 SoundCloud 开发&#xff0c;现已成为 Cloud Native Computing Foundation (…...

欢度我们的节日

众所周知&#xff0c;一年一度的“五一”小长假就要来了。先预祝各位兄弟姐妹们假期快乐&#xff0c;天天好心情&#xff01; 你们在节前的最后一天是处于什么状态呢&#xff1f;是不是已经处理好手中的工作静待明日的旅程&#xff1f;还是忙忙碌碌担心搞不完要加班&#xff1f…...

03_Mybatis-Plus LambadaQueryWrapper 表达式爆空指针异常

&#x1f31f; 03_MyBatis-Plus LambdaQueryWrapper 爆出空指针异常的坑点分析 ❓ 场景描述 来看一段常见的 MyBatis-Plus 查询写法&#xff0c;是否存在问题&#xff1f; Page<VideoInfoVo> videoInfoVosPage videoMapper.selectPage(page, new LambdaQueryWrapper&…...

左右分屏电商带货视频批量混剪自动剪辑生产技术软件:智能剪辑与合规化方案解析

一、引言&#xff1a;电商视频营销的工业化生产需求 在电商带货领域&#xff0c;高效产出差异化视频内容是提升转化率的核心竞争力。本文结合实战经验&#xff0c;解析基于智能分屏算法、动态素材重组、多维度参数配置的工业化剪辑方案&#xff0c;构建可复用的自动化生产流水…...

全面解析SimHash算法:原理、对比与Spring Boot实践指南

一、SimHash算法概述 SimHash是一种局部敏感哈希算法&#xff0c;由Google工程师Moses Charikar提出&#xff0c;主要用于海量文本的快速去重与相似度检测。其核心思想是将高维特征向量映射为固定长度的二进制指纹&#xff08;如64位&#xff09;&#xff0c;通过计算指纹间的…...

【Docker】Docker拉取部分常用中间件

一、拉取MySQL 这里以Docker拉取MySQL5.7为例 #拉取镜像 docker pull mysql:5.7 docker run -d --name oj-mysql -p 3306:3306 -e "TZAsia/Shanghai" -e "MYSQL_ROOT_PASSWORD123456" mysql:5.7 -e 参数用于设置容器内的环境变量。TZ 是用于设置时区的环…...

表征(Representations)、嵌入(Embeddings)及潜空间(Latent space)

文章目录 1. 表征 (Representations)2. 嵌入 (Embeddings)3. 潜空间 (Latent Space)4. 关系总结5. 学习思考 1. 表征 (Representations) 定义: 表征是指数据的一种编码或描述形式。在机器学习和深度学习中&#xff0c;它特指模型在处理数据时&#xff0c;将原始输入数据转换成…...

google colab设置python环境为python3.7

最近在看transformers for machine learning:A Deep Dive这本书&#xff0c;发现书里的python版本是python3.7&#xff0c;但是当前google colab默认的python版本为3.12&#xff0c;带来诸多不便&#xff0c;因此需要将colab版本切换为python3.7的python环境。 1.下载需要的版…...

Kaggle比赛入门攻略(以 Titanic 为例)

为什么选择 Kaggle 入门比赛&#xff1f; Kaggle 是全球最大的数据科学竞赛平台。入门比赛 Titanic: Machine Learning from Disaster 是初学者的理想起点&#xff0c;数据量小、结构简单、题目经典。 Step 1&#xff1a;注册并加入比赛 访问比赛地址&#xff1a;https://www…...

【数据链路层深度解析】从帧结构到协议实现

目录 一、数据链路层核心定位1.1 OSI模型中的位置1.2 三大核心职责 二、帧结构详解2.1 以太网帧标准格式&#xff08;IEEE 802.3&#xff09;2.2 帧封装代码示例 三、核心协议机制3.1 MAC地址体系3.2 介质访问控制CSMA/CD&#xff08;以太网冲突检测&#xff09;现代交换机的演…...

大连理工大学选修课——机器学习笔记(5):EMK-Means

EM&K-Means 无监督学习 什么是无监督学习 模型从无标签的数据中自动发现隐藏的模式或结构聚类是最常用的方法 为什么要研究无监督学习 标记样本代价太大分类模式不断变化&#xff0c;标记易过时 数据的分布 参数方法 高斯分布、伯努利分布、多指分布等 非参数方法 局部模…...

算法基础学习|03整数二分

一、思路 &#xff08;1&#xff09;mid(lr1)/2 if(check(mid)):1.true [mid,r] lmid 2.false [l,mid-1] rmid-1 &#xff08;2&#xff09;mid(lr)/2 if(check(mid)):1.true [l,mid] rmid 2.false [mid1,r] lmid1 二、模板 如何选择模…...

婴幼儿急救实训室优化空间布局科学路径5.7

婴幼儿急救实训室的建设是提升托育服务质量、保障婴幼儿生命安全的关键环节。在当前托育行业快速发展的背景下&#xff0c;加强婴幼儿急救实训室建设&#xff0c;对于培养专业急救人才、提高急救技能水平具有重要意义。凯禾瑞华——实训室建设 一、搭建实操平台&#xff1a;沉浸…...

智能体开发

智能体开发是构建具备感知、决策和执行能力的智能系统的过程&#xff0c;核心围绕环境交互和自主决策展开。以下是关键要点&#xff1a; 一、开发流程 1. 需求定义 - 明确智能体目标&#xff08;如对话交互、自动化任务、数据分析等&#xff09;。 - 确定应用场景&#xff08…...

全球气象站点年平均降水数据(1929-2024)

ppmandata.cn借鉴Compustat、WRDS等国际知名数据库及FT50期刊专业标准&#xff0c;打造中国特色经济管理社会科学研究型数据库。涵盖上市公司、省份、地级市、专精特新等研究对象&#xff0c;涵盖经济、法律、金融、政策、科技、文化、健康、环保、人口等各类热点数据。顶刊标准…...

c++漏缺: stl等 初始化 用法 sort

目录 数组初始化&#xff1a;c int a[5]{1,2,3,4,5};int b[5]a;后面改变b对a有无影响 int pre[n]nums[0]对吗 初始化为0呢 方法1&#xff1a;使用循环初始化 方法2&#xff1a;使用memset函数 方法3&#xff1a;使用初始化列表&#xff08;C99及以后&#xff09; 方法4&…...

usb端点笔记

端点&#xff1a;端点是USB设备的唯一可识别部分&#xff0c;其是主机和设备之间的通信流的终点。是一个USB设备或主机上的一个数据缓冲区&#xff0c;用来存放和发送USB的各种数据。&#xff08;逻辑上&#xff09; 接口&#xff1a;可以理解为一个功能。&#xff08;物理功能…...

多智能体协同作战:MagenticOne如何指挥一支AI团队

你有没有想过&#xff0c;如果能让多个AI智能体像高效团队一样协同工作会怎样&#xff1f;每个成员各司其职&#xff0c;却又紧密配合。今天&#xff0c;我们就来聊聊AI世界的"特工组织"——多智能体系统&#xff0c;尤其是最近热门的MagenticOne架构。 &#x1f9e…...

C++静态编译标准库(libgcc、libstdc++)

在使用GCC编译器时&#xff0c;部分版本默认动态加载标准库。如果客户机器上没有安装相应库&#xff0c;就会提示找不到&#xff1a;libgcc_s_seh-1.dll、libstdc-6.dll、libwinpthread-1.dll。 解决方法&#xff1a; 设有动态库libadd.dll、静态库libmul.a 编译命令&#x…...

[PRO_A7] SZ501 FPGA开发板简介

SZ501 FPGA开发板简介 概述 SZ501 FPGA开发板是专为高性能FPGA设计、快速原型开发和复杂应用调试打造的先进开发平台。搭载Xilinx Artix-7系列XC7A100T FPGA芯片&#xff0c;SZ501提供卓越的逻辑运算能力和灵活的接口支持&#xff0c;广泛适用于通信、信号处理、嵌入式系统及…...

URP - 序列图动画的实现

效果&#xff1a; 【太妃糖耶】更新了一条视频&#xff0c;快来围观&#xff01; 序列图动画的实现 首先先了解下序列图样式的纹理图片 如上图一可在Shader中使用该图片制作燃烧的火的动画&#xff0c;但是如何实现呢&#xff1f;接下来一起来看一下吧 序列图动画的实现原理大…...

Helm部署kong+konga的路由管理系统

部署postgres服务 创建存储类 创建存储类对应的deployment --- apiVersion: apps/v1 kind: Deployment metadata:annotations: {}labels:app: eip-nfs-postgresql-storageclassname: eip-nfs-postgresql-storageclassnamespace: kube-systemresourceVersion: 26709116 spec:…...

液氮恒温器原理解析

一、‌核心降温原理‌ 1、‌液氮媒介作用‌ 液氮恒温器以液氮&#xff08;沸点约77K/-196℃&#xff09;为降温媒介&#xff0c;通过液氮蒸发吸收热量的特性实现快速降温。 液氮在内部腔体蒸发时形成气-液界面&#xff0c;利用毛细管路将冷媒导入蒸发器&#xff0c;强化热交换…...

EchoMimic 阿里开源数字人项目的复现过程

EchoMimic 是一个由阿里巴巴蚂蚁集团开发的开源AI 数字人项目&#xff0c;通过可编辑地标调节实现逼真的音频驱动肖像动画&#xff0c;它能够将静态图像转化为具有动态语音和表情的数字人像。 今天咱们来复现下&#xff0c;看看有哪些坑&#xff0c;再看看数字人效果如何。 先…...

iVX 开源战略:多维突破下的产业生态革新与未来图景

在开源技术浪潮席卷全球软件产业的当下&#xff0c;iVX 凭借持续迭代的开源战略&#xff0c;不断突破技术边界&#xff0c;拓展应用场景&#xff0c;重塑产业生态。从底层技术架构的深度优化&#xff0c;到多行业应用场景的全面覆盖&#xff1b;从全球化生态体系的完善构建&…...

数据库12(游标)

游标语法 declare c1 cursor for select title from titles --定义一个游标c1&#xff0c;确定游标对应的列是titles表的title列&#xff0c;游标可以对应多个列 declare bname varchar(50) --声明变量 open c1 --初始化&#xff0c;开始使用游标 fetch next from c1 in…...

Windows11下本地化部署AI开发环境(Dify+Ollama)

前言 本次实践希望在Windows环境下本地化部署AI开发环境&#xff0c;通过Ollama下载运行模型&#xff0c;通过Dify搭建管理AI应用。 硬件环境 AI大模型开发对硬件要求较高&#xff0c;理论上配置越高越好。本次搭建环境如下&#xff1a; Windows系统&#xff08;Windows11&…...

Oracle Bigfile 与 Smallfile 表空间对比分析

Oracle Bigfile 与 Smallfile 表空间对比分析 一、基本概念对比 特性Bigfile 表空间Smallfile 表空间定义每个表空间只包含一个大数据文件每个表空间可包含多个数据文件引入版本Oracle 10gOracle 传统模式最大文件大小取决于块大小(32TB for 8K块)通常最大32GB(传统限制)文件…...