为什么从可变引用读取时无法自动取消引用?

问题描述 投票:0回答:1

我从Rusling收到这个问题:

fn vec_loop(mut v: Vec<i32>) -> Vec<i32> {
    for element in v.iter_mut() {
        *element = *element * 2;
    }

    v
}

vec_loop
v
中的元素原地乘以 2。但我不知道为什么我不能这样写:

*element = element * 2;

我收到编译器错误:

error[E0369]: cannot multiply `&mut i32` by `{integer}`
  --> exercises/vecs/vecs2.rs:14:28
   |
14 |         *element = element * 2;
   |                    ------- ^ - {integer}
   |                    |
   |                    &mut i32
   |
help: `*` can be used on `i32` if you dereference the left-hand side
   |
14 |         *element = *element * 2;
   |                    +

据我所知,

&i32
引用可以自动取消引用以供阅读。为什么不可以
&mut i32

例如,来自同一个 Rustling 的另一个函数:

fn vec_map(v: &Vec<i32>) -> Vec<i32> {
    v.iter().map(|element| {
        element * 2
    }).collect()
}

在这种情况下,自动延迟起作用。不用写

*element * 2

rust dereference
1个回答
0
投票

Mul
的实现,用于
&i32 * i32
,这就是后者起作用的原因。然而
&i32
&mut i32
是不同的类型,虽然后者可以被 强制 转换为前者,但在推导出像
Mul
这样的特征实现时,不会应用强制。

因此,由于

&mut i32 * i32
没有实现,您必须显式取消引用或重新借用
element
*element * 2
&*element * 2

© www.soinside.com 2019 - 2024. All rights reserved.