Rust 为什么我可以调用一个函数来接受一个引用和一个引用的引用?
据我所知,Rust 为什么我可以调用一个函数来接受一个引用和一个引用的引用?,rust,Rust,据我所知,&符号创建了一个引用。但是使用sum_vec加上或不加&都可以编译。我只想知道当我做let s1=sum_vec(&v1)时发生了什么。这会创建一个引用的引用吗 fn main() { // Don't worry if you don't understand how `fold` works, the point here is that an immutable reference is borrowed. fn sum_vec(v: &Vec<i3
&
符号创建了一个引用。但是使用sum_vec
加上或不加&
都可以编译。我只想知道当我做let s1=sum_vec(&v1)时发生了什么代码>。这会创建一个引用的引用吗
fn main() {
// Don't worry if you don't understand how `fold` works, the point here is that an immutable reference is borrowed.
fn sum_vec(v: &Vec<i32>) -> i32 {
return v.iter().fold(0, |a, &b| a + b);
}
// Borrow two vectors and sum them.
// This kind of borrowing does not allow mutation to the borrowed.
fn foo(v1: &Vec<i32>, v2: &Vec<i32>) -> i32 {
// do stuff with v1 and v2
let s1 = sum_vec(v1);//This wil also complile with &. Is this optional?.
let s2 = sum_vec(v2);
// return the answer
s1 + s2
}
let v1 = vec![1, 2, 3];
let v2 = vec![4, 5, 6];
let answer = foo(&v1, &v2);
println!("{}", answer);
println!("{}", v1.len());
}
fn main(){
//如果您不了解“fold”是如何工作的,请不要担心,这里的要点是借用了一个不可变的引用。
fn sum_vec(v:&vec)->i32{
返回v.iter().fold(0,| a,&b | a+b);
}
//借用两个向量并求和。
//这种借用方式不允许对借用者进行变异。
fn foo(v1:&Vec,v2:&Vec)->i32{
//用v1和v2做一些事情
设s1=sum_vec(v1);//这也将与&.这是可选的吗?。
设s2=和向量(v2);
//回答
s1+s2
}
设v1=vec![1,2,3];
设v2=vec![4,5,6];
让答案=foo(&v1和&v2);
println!(“{}”,答案);
println!(“{}”,v1.len());
}
()是和否。Rust将创建对引用的引用(因为您使用&
运算符明确请求它),然后立即再次“自动删除”它以适合目标类型。优化器随后将删除该中间引用。是和否。Rust将创建一个引用引用(因为您使用&
操作符明确要求它),然后立即再次“自动删除”它以适合目标类型。优化器随后将删除该中间引用。注意:采用&[T]
参数比采用&Vec
参数更惯用(更灵活)。Vec
和slice之间的唯一区别是后者在可变时允许添加/删除元素。因为当不可变时没有区别,所以使用最小公分母允许更多的代码调用函数。@MatthieuM。就像我们这样,我们不必一直重复^ ^为什么不喜欢?@CodeJoy:StackOverflow的秘密;不要太担心一次投票。注意:使用&[t]
参数比使用&Vec
参数更为惯用(也更灵活)。Vec
和slice之间的唯一区别是后者在可变时允许添加/删除元素。因为当不可变时没有区别,所以使用最小公分母允许更多的代码调用函数。@MatthieuM。就像我们这样,我们不必一直重复^ ^为什么不喜欢?@CodeJoy:StackOverflow的秘密;不要太担心一次投票。Clippy会警告你输入了一些愚蠢的东西。Clippy会警告你输入了一些愚蠢的东西。