Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 为什么我可以调用一个函数来接受一个引用和一个引用的引用?_Rust - Fatal编程技术网

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会警告你输入了一些愚蠢的东西。