为什么& v [1] +& v [2]与Rust中的v [1] + v [2]具有相同的结果?

时间:2018-01-07 22:56:22

标签: rust

我正在学习所有权和借款。

borrow1borrow2之间的区别在于&中打印时borrow2的使用情况:

fn borrow1(v: &Vec<i32>) {
    println!("{}", &v[10] + &v[12]);
}

fn borrow2(v: &Vec<i32>) {
    println!("{}", v[10] + v[12]);
}

fn main() {
    let mut v = Vec::new();

    for i in 1..1000 {
        v.push(i);
    }

    borrow1(&v);
    println!("still own v {} , {}", v[0], v[1]);

    borrow2(&v);
    println!("still own v {} , {}", v[0], v[1]);
}

为什么他们会提供相同的输出,即使borrow1没有&

1 个答案:

答案 0 :(得分:4)

[]的索引运算符(Vec<T>)返回T。在这种情况下,那是i32。因此,v[0]会返回i32&v[0]会返回&i32

let a: i32 = v[0];
let b: &i32 = &v[0];

v[0]仅适用于i32实施Copy

i32已为(i32, i32)(&i32, &i32)的(左侧,右侧)对实施Add。这两个实现以相同的方式添加值,因此您得到相同的结果。

另见: