我从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
Mul
的实现,用于 &i32 * i32
,这就是后者起作用的原因。然而 &i32
和 &mut i32
是不同的类型,虽然后者可以被 强制 转换为前者,但在推导出像 Mul
这样的特征实现时,不会应用强制。
因此,由于
&mut i32 * i32
没有实现,您必须显式取消引用或重新借用 element
:*element * 2
或 &*element * 2
。