为什么对Vec进行索引返回值而不是Index所承诺的引用?

18

Index特质的文档说明.index()方法返回与Output关联类型相关的引用(链接):

fn index(&self, index: Idx) -> &Self::Output;

对于 Vec<T>usize 索引,OutputT。因此,我期望以下片段中的变量 a 具有类型 &i32

let v = vec![0];
let a = v[0];

然而,a 的类型是 i32。为什么呢?我正在学习 Rust,就我所理解的来看,Rust 要求您在任何地方都必须明确,并且永远不会隐式执行 value<->reference 转换。因此我有这个问题。

3
巧合的是,正是由于“引用是显式的”这一设计决策,索引语法才会自动取消引用,因为它强制您在仅想引用元素时添加一个(例如&v [0])。 - kmdreko
4
这也与C语言一致,在C语言中,x[y] 实际上是一个显式的解引用,定义为*(x+y),因此Rust选择让其语法以许多人所期望的方式工作是有道理的。 - Peter Cordes
1个回答

20

当括号被去糖化时,会自动进行取消引用。根据std::ops::Index文档的说法,"container[index]实际上是*container.index(index)的语法糖。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接