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

为何Rust中[]索引尝试移动值,直接调用index方法却不会?

Rust索引语法与index方法的差异问题

先看这段代码:

use std::ops::Index;

fn test(v: &Vec<Vec<i32>>) {  
    let t = v.index(0); // 正常编译
    let t = v[0]; // 报错:Vec<i32> 未实现 Copy trait
}

为什么同样是取索引,两种写法结果不一样?查Vec的Index trait文档,里面写着:

fn index(&self, index: I) -> &<Vec<T, A> as Index<I>>::Output
执行索引(container[index])操作

按说这两种写法应该等价,问题出在索引语法的自动解引用上:

  • 直接调用v.index(0)时,v是&Vec<Vec<i32>>类型,调用后返回&Vec<i32>,编译器会自动把t推导为&Vec<i32>,完全符合类型要求,所以编译通过。
  • 使用v[0]时,[]是语法糖,它等价于*v.index(0)——也就是对index方法返回的引用做了解引用操作。此时编译器会尝试把解引用后的Vec<i32>赋值给t,但Vec<i32>没有实现Copy trait,无法直接复制,因此报错。

要解决这个问题,只需要显式保留引用即可:

let t = &v[0]; // 正常编译
// 或者显式指定类型
let t: &Vec<i32> = v[0];

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 15:29:51