Rust的这一方面乍一看似乎很奇怪,我想知道在这种情况下for
键入是如何工作的。
fn sum1(v: &mut Vec<i32>) -> i32 {
// I know I don't mutate v, but that's not the point
let mut s = 0;
for e in v {
s += *e;
// s += e; <- Err!
}
s
}
fn sum2(v: &Vec<i32>) -> i32 {
let mut s = 0;
for e in v {
s += e; // Okay?
}
s
}
fn main() {
let mut v = vec![1, 2, 3];
println!("{}", sum1(&mut v));
println!("{}", sum2(&v));
}
起初,我对为什么要在sum1
中取消引用感到困惑。但是好吧,这是说AddAssign<&mut i32>
未实现,所以我看到e
是&mut i32
。即时更改e
真是太棒了。
但是现在,有了这些信息,为什么sum2
会进行编译?看来AddAssign<&i32>
确实已实现(我分别测试了),因此很有可能在AddAssign
上使用了&i32
方法,但同样有可能{{1} }就是e
。我的问题可以归结为:
i32
是e
还是i32
?
我对参考文献了解不足,无法自己检查差异(通过使用&i32
以外的内容并检查崩溃)。 i32
是最合逻辑的,但我想确定。
来自C语言,指针和值之间的混合非常令人困惑,并且它已经花了我很多时间来适应自动解引用/引用其参数的函数(我认为我还没有真正做到这一点) )。
编辑:
可以使用How do I print the type of a variable in Rust?验证类型(并回答我的问题),这对弄乱类型很有用,但不能直接回答for循环的工作方式。 What is the exact definition of the for loop in Rust?很有帮助,What is the difference between iter and into_iter?讨论了可能导致循环混乱的相关&i32
特性。