【rust简单工具理解】

1.map方法

map这个闭包的本质就是映射

rust 复制代码
let numbers = vec![1, 2, 3, 4, 5];
let numbers_f64: Vec<f64> = numbers.into_iter().map(|&x| x as f64).collect();
println!("{:?}", numbers_f64); // 输出: [1.0, 2.0, 3.0, 4.0, 5.0]

2.and_then

and_then 是 Rust 中 Option 和 Result 类型的一个方法,它用于链式处理可能的错误或 None 值。当你有一个 Option 或 Result 类型的值,并且想要根据它的值执行某些操作时,这个方法非常有用。

对于 Option 类型,and_then 方法接受一个闭包,这个闭包接受 Option 中的值,并返回另一个 Option。如果原始的 Option 是 None,and_then 会立即返回 None,而不会执行闭包。如果原始的 Option 是 Some(value),and_then 会将 value 传递给闭包,闭包返回的 Option 将作为 and_then 的最终结果。

对于Result类型,and_then 的行为类似,但它用于处理可能的错误。如果原始的 Result 是 Ok(value),and_then 会将 value 传递给闭包,闭包返回的 Result 将作为 and_then 的最终结果。如果原始的 Result 是 Err(_),and_then 会立即返回这个错误。

3.parse()

在 Rust 中,parse 方法用于将字符串解析为特定的数据类型。这个方法通常是通过为类型实现 std::str::FromStr trait 来提供的。当字符串的格式符合预期的数据类型时,parse 方法能够安全地转换字符串为该类型。如果字符串不符合格式要求,parse 方法会返回一个 Result 类型,其中包含一个错误信息(Err),或者转换成功的值(Ok)。

rust 复制代码
fn main() {
    let num_str = "123";
    match num_str.parse::<i32>() {
        Ok(num) => println!("Parsed number is: {}", num),
        Err(e) => println!("Error parsing string: {}", e),
    }
}
rust 复制代码
fn main() {
    let float_str = "3.14";
    match float_str.parse::<f64>() {
        Ok(num) => println!("Parsed float is: {}", num),
        Err(e) => println!("Error parsing string: {}", e),
    }
}

高级用法

rust 复制代码
use std::num::ParseIntError;

#[derive(Debug, PartialEq)]
struct MyNumber {
    value: i32,
}

impl std::str::FromStr for MyNumber {
    type Err = ParseIntError;

    fn from_str(s: &str) -> Result<Self, Self::Err> {
        let num: i32 = s.parse()?;
        Ok(MyNumber { value: num })
    }
}

fn main() {
    let my_num_str = "42";
    match my_num_str.parse::<MyNumber>() {
        Ok(my_num) => println!("Parsed MyNumber is: {:?}", my_num),
        Err(e) => println!("Error parsing string: {}", e),
    }
}

4.unwrap()

在实际编程中,应该尽量避免使用 unwrap(),特别是在生产代码中,因为它会导致程序在遇到错误时崩溃。相反,应该使用 match、if let、expect 或其他方法来优雅地处理错误或 None 值。这样可以提高程序的健壮性和可维护性

5.as_array()

在 Rust 中,并没有一个全局的 as_array() 方法。然而,as_array() 方法可能出现在使用 serde_json crate 处理 JSON 数据时。serde_json 是一个流行的 Rust 库,用于序列化和反序列化 JSON 数据。

当你从 JSON 数据中反序列化一个值到 serde_json::Value 类型时,你可能需要检查这个值是否是一个数组,并从中提取数据。serde_json::Value 类型提供了 as_array() 方法,但它实际上返回一个选项类型 Option<&Value>,其中包含对数组中所有 Value 实例的引用的切片。

6.filter_map

这个等于是map的加强版闭包

rust 复制代码
fn main() {
    let nums = vec![1, 2, 3, 4, 5];
    
    // 过滤出偶数,并将其转换为字符串
    let evens_as_strings: Vec<String> = nums.into_iter()
        .filter_map(|x| if x % 2 == 0 { Some(x.to_string()) } else { None })
        .collect();
    
    println!("{:?}", evens_as_strings); // 输出: ["2", "4"]
}
相关推荐
shmily麻瓜小菜鸡6 分钟前
JS/TS 易踩坑知识点 — 模块化与工程化类
开发语言·javascript·ecmascript
geovindu18 分钟前
CSharp: Observer Pattern
开发语言·后端·观察者模式·设计模式·c#·.netcore·行为模式
Flynt1 小时前
把公司项目迁到 Spring Boot 4.0:编译通过只是开始
java·spring boot·后端
郝学胜-神的一滴1 小时前
C++11 工程级应用 09:告别无谓拷贝,解锁高性能移动语义
开发语言·数据结构·c++·vscode·软件工程·visual studio
IT_陈寒1 小时前
Redis误用keys命令把生产环境搞崩了,血的教训
前端·人工智能·后端
她的男孩2 小时前
多租户和数据权限怎么共存?扒完拦截器注册链路,我找到 4 个隐蔽的坑
java·后端·架构
用户8356290780512 小时前
使用 Python 设置 Excel 页眉和页脚
后端·python
步行cgn2 小时前
IoC 控制反转:从概念到 Spring 的实现
后端
MC皮蛋侠客2 小时前
OPC UA 系列(一):标准全景与 Python 最小闭环——让第一条设备数据流动起来
开发语言·python·opcua
爱勇宝2 小时前
没有 Fn 键关触控板?我做了一个双击即用的 Windows 小工具
前端·后端·程序员