什么是保持集合中借用值的Rust方法?

Yur*_*lgn 3 rust

在这:

#[derive(Debug)]
struct Person {
    name: String,
}

fn main() {
    let mut persons = Vec::<Person>::with_capacity(3);
    let mut personrefs = Vec::<&Person>::with_capacity(persons.capacity());
    for x in 0..persons.capacity() {
        let person = Person {
            name: format!("Alice-{}", x),
        };
        personrefs.push(&person);
        persons.push(person);
    }
    println!("persons are {:#?}", persons);
}
Run Code Online (Sandbox Code Playgroud)

有点理解为什么Rust不允许推送&person,但Rust解决这个问题的方法是什么?

我有一个Vec"拥有" Person的,但我也想将人们映射到其他一些数据而不触及内存中的拥有Vec或复制Person.喜欢,有一个collections::HashMap<&Person, SomeOtherData>.如果同时HashMapVec具有相同的寿命,不会生锈知道什么时候取消分配PersonS'

She*_*ter 5

"生锈方式"是不会导致记忆不安全的方式.您的代码无效,因为编译器会告诉您:

error[E0597]: `person` does not live long enough
  --> src/main.rs:13:26
   |
13 |         personrefs.push(&person);
   |                          ^^^^^^ borrowed value does not live long enough
14 |         persons.push(person);
15 |     }
   |     - `person` dropped here while still borrowed
16 |     println!("persons are {:#?}", persons);
17 | }
   | - borrowed value needs to live until here
Run Code Online (Sandbox Code Playgroud)

您正在创建Person循环内部,引用它,然后移动Person到新的内存地址,使引用无效.如果您访问该引用,则会触及未定义的内存,最好导致段错误或最糟糕的"奇怪行为"/安全漏洞.

同样,你不能将人添加到Vec循环中然后在循环中引用该人,因为循环的后续迭代将使变量变异.当您推送向量时,它可能会重新分配内存,再次使您的引用无效.

我把这段代码写成了

fn main() {
    let persons: Vec<_> = (0..3)
        .map(|x| Person {
            name: format!("Alice-{}", x),
        })
        .collect();

    let personrefs: Vec<_> = persons.iter().collect();
    println!("persons are {:#?}", persons);
}
Run Code Online (Sandbox Code Playgroud)