在这:
#[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>.如果同时HashMap与Vec具有相同的寿命,不会生锈知道什么时候取消分配PersonS'
"生锈方式"是不会导致记忆不安全的方式.您的代码无效,因为编译器会告诉您:
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)
| 归档时间: |
|
| 查看次数: |
60 次 |
| 最近记录: |