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

Rust中向量元素引用&i32的作用及与直接取值的区别疑问

Rust中向量元素引用与复制的区别

两段代码不等价

直接明确结论:这两段代码的行为完全不同,核心差异在于复制值和获取引用的区别。

示例2:复制值的行为

let v = vec![1, 2, 3, 4, 5];
let third: i32 = v[2];

因为i32实现了Copy trait,执行这段代码时,会把向量v中索引2处的元素值(即3)完整复制一份,赋值给新变量third。此时:

  • third是独立的i32变量,和v中的原元素无关联,修改third不会影响v,反之亦然。
  • third占用i32大小的内存(通常4字节),存储的是值本身。

示例1:获取引用的行为

let v = vec![1, 2, 3, 4, 5];
let third: &i32 = &v[2];

这里的&i32是不可变共享引用,本质是指向原数据的指针:

  • third没有复制v[2]的值,而是存储了v[2]在内存中的地址,大小为一个指针的尺寸(64位系统是8字节)。
  • 通过*third可以访问原元素的值,但因是不可变引用,无法修改原元素(若使用&mut i32则允许修改)。
  • 这段代码受Rust借用规则约束:在third的生命周期内,不能对v获取可变引用,也不能移动v,这是Rust保证内存安全的核心机制。

关于Copy类型的引用误区

你提到的“简单值会被复制,无法从两处引用同一简单值”是对Rust规则的误解:

  • Copy trait仅规定赋值、传参等场景下自动复制值,但完全不限制对该值创建引用。
  • 即使是i32这类Copy类型,依然可以创建多个不可变引用指向它,符合Rust内存安全规则。示例:
    let x = 5;
    let ref1 = &x;
    let ref2 = &x;
    // 同时持有两个不可变引用是合法的
    

内容的提问来源于stack exchange,提问作者bennouli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 21:37:04