for循环是对引用还是按值进行操作?

时间:2018-11-01 22:34:50

标签: for-loop rust

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。我的问题可以归结为:

i32e还是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特性。

0 个答案:

没有答案