为何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>没有实现Copytrait,无法直接复制,因此报错。
要解决这个问题,只需要显式保留引用即可:
let t = &v[0]; // 正常编译 // 或者显式指定类型 let t: &Vec<i32> = v[0];
内容的提问来源于stack exchange,提问作者Some Name
相关产品推荐
相关产品推荐

