rust语言学习笔记Trait之 AsRef 和 AsMut(引用转换)

1、AsRef 不可变引用

rust 复制代码
pub trait AsRef<T> {
    fn as_ref(&self) -> &T;
}
  • String 实现了 AsRef<str>,所以你可以把 String 当作 &str
  • Vec<T> 实现了 AsRef<[T]>,让你能用切片接口操作向量
  • PathBuf 实现了 AsRef<Path>,统一了路径操作

(1)转为:&str,函数可接收: String&str

rust 复制代码
fn str_test_fn<S: AsRef<str>>(s: S) {
    println!("{}", s.as_ref());
}

fn main() {
    str_test_fn("&str 字符串");
    str_test_fn(String::from("String 字符串"));
}

(2)转为:&[T],函数可接收: Vec切片数组

rust 复制代码
fn vec_test_fn<V: AsRef<[i32]>>(v: V) {
    println!("{:?}", v.as_ref());
}
fn main() {
    vec_test_fn(vec![1, 2, 3]);   // Vec
    vec_test_fn(&[5, 6, 7]);      // 切片
    vec_test_fn([10, 11, 12]);    // 数组
}

(3)转为:&[u8],函数可接收:String &strVec<u8>&[u8][u8;n]

rust 复制代码
fn bytes_test_fn<T: AsRef<[u8]>>(data: T) {
    let bytes = data.as_ref();
    println!("{:?}", bytes);
}

fn main() { // 可以接受多种类型
    let s = String::from("String 字符串");     // String
    let s2 = "&str 字符串";                    // &str
    let v: Vec<u8> = vec![1, 2, 3];           // Vec<u8>
    let arr: &[u8] = &[4, 5, 6];              // &[u8]
    let arr2: [u8; 3] = [7, 8, 9];            // u8数组
}

(4)转为: &Path,函数可接收:PathBufString&str&Path

rust 复制代码
use std::path::{Path, PathBuf};

fn path_test_fn<P: AsRef<Path> + 'static>(p: P) {
    let path = p.as_ref();
    println!("{}", path.display());
}

fn main() {
    // PathBuf
    let p1 = PathBuf::from("/tmp/test1");
    path_test_fn(p1);

    // String
    path_test_fn(String::from("/tmp/test2"));

    // &str
    path_test_fn("/tmp/test3");

    // &Path
    let p2 = Path::new("/tmp/test4");
    path_test_fn(p2);
}

2、AsMut 可变引用

rust 复制代码
pub trait AsMut<T> {
    fn as_mut(&mut self) -> &mut T;
}
  • String 实现了 AsMut<str>
  • Vec<T> 实现了 AsMut<[T]>
  • Box<T> 实现了 AsMut<T>

(1)转为:&mut str,函数可接收:&mut strStringBox<str>

rust 复制代码
fn str_test_fn<S: AsMut<str>>(mut s: S) {
    let str = s.as_mut();
    println!("{}", str);
}

fn main() {
    str_test_fn(String::from("String 字符串"));    // String
    str_test_fn(Box::from("Box<str>"));           // Box<str>
}

(2)转为:&mut [T],函数可接收:Vec<T>[T;N]

rust 复制代码
fn mut_t_test_fn<T: AsMut<[i32]>>(mut data: T) {
    let d = data.as_mut();              // 获取 &mut [i32] 可变引用
    for da in d.iter_mut() {            // 遍历
        *da += 2;                       // 修改每一项的值
    }
    println!("{:?}", d);
}

fn main() { 
    let v: Vec<i32> = vec![1, 2, 3];               // Vec<i32>
    let arr: [i32; 3] = [7, 8, 9];                 // i32数组
    let bx: Box<[i32]> = Box::from([33, 34, 5]);   //Box<[i32]>
}
相关推荐
k4m7v2pz7 分钟前
交叉编译 Rust 到 aarch64 Linux 掌机:glibc 版本与 sysroot 重建的完整踩坑记录
rust·glibc·交叉编译·aarch64·zigbuild·sysroot
_Narcissus_19 分钟前
分治&递归
数据结构·c++·笔记·算法·leetcode·递归·分治
边境悍匪25 分钟前
springboot常用注解
java·spring boot·学习
Capricorn198832 分钟前
科研引用无法溯源怎么排查?知芽 Notebook Skill 技术机制拆解
大数据·论文阅读·人工智能·笔记·论文笔记
Capricorn19881 小时前
Agent 记忆层接入后引用仍不可信?知芽 Notebook Skill 排障指南
大数据·论文阅读·人工智能·笔记·架构
自小吃多1 小时前
PCB Editor放置元器件笔记
笔记·嵌入式硬件
Hotchip_MEMS3 小时前
消费电子声学升级核心器件:MP381A-AB17D MEMS麦克风参数详解与应用场景
人工智能·笔记·物联网·电脑·制造
️学习的小王3 小时前
AI Agent Skills实战教程:从原理到上手编写SKILL.md
人工智能·深度学习·学习·机器学习
k4m7v2pz4 小时前
用 Rust 重造 Java 的 CLI 分发体验:从 java -jar 到 wasmtime run
rust·跨平台·webassembly·wasmtime·wasi·java-jar
春风解人意4 小时前
从零开始学习嵌入式P29----线程间的通信
c语言·嵌入式硬件·学习