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问题。)@是的,就是那个。