For loop for循环是按引用操作还是按值操作?

For loop for循环是按引用操作还是按值操作?,for-loop,rust,For Loop,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:

生锈的这一方面一开始似乎很奇怪,我想知道
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));
}
fn sum1(v:&mut Vec)->i32{
//我知道我不会变异v,但这不是重点
设muts=0;
对于v中的e{
s+=*e;
//s+=e;i32{
设muts=0;
对于v中的e{
s+=e;//好吗?
}
s
}
fn main(){
让mut v=vec![1,2,3];
println!(“{}”,sum1(&mut v));
println!(“{}”,sum2(&v));
}
起初我不明白为什么它要我在
sum1
中取消引用。但好吧,它说
AddAssign
没有实现,所以我看到
e
&muti32
。这对于动态地更改
e
来说真是太棒了

但是现在,有了这些信息,为什么
sum2
要编译呢?看起来
AddAssign
确实实现了(我单独测试了),所以它有可能在
&i32
上使用
AddAssign
方法,但也有可能
e
只是
i32
。我的问题归结为:

e
i32
,还是
&i32

我对引用了解不够,无法自己轻松检查差异(通过使用
i32
和检查崩溃以外的其他方法)。
&i32
是最符合逻辑的,但我想确定

来自C语言,指针和值之间的混合非常混乱,我已经花了很多时间来习惯函数自动取消引用/引用它们的参数(我认为我还没有真正做到)

编辑:


该类型可以用进行验证(并回答我的问题),这很有用,但不能直接回答for循环是如何工作的。这很有帮助,并讨论了一个相关的
IntoIterator
特性,它可能会导致循环混淆。

看起来相关,但答案只是说“未为
&mut i32
实现
+
运算符。”“。从这个答案中,不清楚为什么它没有实现。我可以看到
+
是为
&
而不是
&mut
实现的,但我的问题更多的是关于
e
sum2
中的类型。Rust似乎没有一个
typeof
操作符来检查。我的问题归结为:“e是i32还是&i32?”-回答了你的问题吗?嗯,可能是,但更多的是,我在寻找向量上的循环和迭代器的工作原理。我的
typeof
引用有点放错了位置(如果我只是在寻找crust中“
typeof
”的答案,它就会变成XY问题。)@是的,就是那个。