生 rust :赋值左侧和右侧的索引向量不对称

inkz8wg9  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(123)

有没有人能解释一下&v[0]v[0]之间的区别,其中vVector?如果让我猜它类似于"借用"和"移动",然而下面的例子会提出不同的原因。
(一)
您可以通过引用索引号来访问矢量项:

let mut data = vec![5, 10, 15];

    let first = &data[0];
    println!("The first element is {}", first);

要更改特定项目的值,请参阅索引号:

let mut data = vec![5, 10, 15];

data[0] = 15;

为什么不在示例2中使用&data[0],而在示例1中相反?如果向量中的类型没有实现Copy trait,数据会被移动吗?
PS:我是C++背景的。

irtuqstp

irtuqstp1#

方括号索引语法会自动对IndexIndexMut trait返回的结果进行derefs,解析为存储在数据结构中的值,而你必须显式引用才能得到一个引用。
这意味着你的例子去糖了

// needed for explicit `index` and `index_mut`
use std::ops::{Index, IndexMut};

let mut data = vec![5, 10, 15];

let first = &{ *data.index(0) }; // first has type `&i32`
println!("The first element is {}", first);

data[0] = 15; // assignment is always done through IndexMut
*data.index_mut(0) = 15;

let mut_ref: &mut i32 = &mut data[i]; // also desugars to IndexMut
let mut_ref: &mut i32 = data.index_mut(i);

let imm_ref: &i32 = &data[i]; // desugars to Index
let imm_ref: &i32 = data.index(i);

let val: i32 = data[i]; // desugars to dereferenced Index
let val: i32 = *data.index(i);

对于使用整数的示例(Copy类型,意味着它们在移动后仍然可以使用),在第一种情况下,确实没有理由使用引用而不仅仅是data[i]

相关问题