Rust中各类含指针Vector的差异解析:重点关注Vec<&mut &usize>
Rust中几种Vector类型的差异对比
Vec<usize>
直接存储usize类型的数值,vector完全拥有这些值的所有权。创建后可以随意修改、新增、删除元素,销毁vector时会自动清理所有存储的数值,不需要依赖任何外部变量。Vec<&usize>
存储的是usize的不可变引用,每个元素都是指向外部某个usize变量的只读指针。vector不拥有这些变量的所有权,必须保证被引用的变量生命周期比vector长。只能读取指向的数值,绝对不能修改。Vec<&mut usize>
存储的是usize的可变引用,每个元素是指向外部usize变量的可写指针。同样不拥有所有权,生命周期必须合法。可以通过引用修改指向的usize值,但要遵守Rust的借用规则:同一时间同一变量只能存在一个可变引用。Vec<&mut &usize>(重点)
这是存储指向不可变引用的可变引用,拆解开来理解:- 最内层是
&usize——一个指向usize值的不可变引用; - 外层的
&mut——意味着我们可以修改这个不可变引用本身,但无法修改它指向的usize值。
举个实际代码例子:
let num1: usize = 10; let num2: usize = 20; let mut target_ref: &usize = &num1; // 一个不可变引用,初始指向num1 let mut vec = vec![&mut target_ref]; // 合法操作:修改vec里的引用,让它指向num2 *vec[0] = &num2; println!("{}", *vec[0]); // 输出20 // 非法操作:尝试修改num2的值,会报错 // *vec[0] = 30; // 编译失败,因为最内层是不可变引用,无法修改目标值核心差异点:
- 和
Vec<&mut usize>的区别:后者能修改指向的usize数值,前者只能改变“引用的指向”,不能碰数值本身; - 和
Vec<&usize>的区别:后者的引用指向固定死了,不能改,前者可以随时切换引用的目标; - 所有权规则:既不拥有底层的
usize值,也不拥有中间的&usize引用的所有权,只是拿到了对那个&usize引用的可变借用权,必须保证中间的引用变量(比如例子里的target_ref)生命周期比vector长。
- 最内层是
内容的提问来源于stack exchange,提问作者StaticESC
相关产品推荐
相关产品推荐

