【问题标题】:Why does &v[1] + &v[2] have the same result as v[1] + v[2] in Rust?为什么 &v[1] + &v[2] 与 Rust 中的 v[1] + v[2] 有相同的结果?
【发布时间】:2018-01-07 22:56:21
【问题描述】:

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

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 没有&amp;,为什么它们给出相同的输出?

【问题讨论】:

  • "burrow" != "borrow"
  • 嘿Shepmaster,你所说的“洞穴”是什么意思!=“借”。
  • burrow: 兔子、狐狸或类似动物在地下挖出的洞或隧道,用于居住和避难borrow接受或获得返回相同或等价物的承诺
  • 注意你可以写这个let v: Vec&lt;_&gt; = (1..10).collect();而不是循环。
  • Boiethios - 很高兴知道! :)

标签: rust


【解决方案1】:

Vec&lt;T&gt; 的索引运算符 ([]) 返回 T。在这种情况下,这是一个i32。因此v[0] 返回一个i32&amp;v[0] 返回一个&amp;i32

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

v[0] 之所以有效,是因为i32 实现了Copy

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

另见:

【讨论】:

    猜你喜欢
    • 2019-01-08
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    相关资源
    最近更新 更多