You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>(重点)
    这是存储指向不可变引用的可变引用,拆解开来理解:

    1. 最内层是&usize——一个指向usize值的不可变引用;
    2. 外层的&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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 12:55:37