Rust 结构中可变元素的生存期

Rust 结构中可变元素的生存期,rust,Rust,如何在结构中定义可变元素?如果我有以下例子: struct User>{ 让mut addresses=Vec::new(); 让mut users=Vec::new(); 用户。推送(用户{ 引用:“ref.”to_string(), 电子邮件:“test@test.com“.to_string(), 地址:&多个地址 }); 使用者 } …它导致了这个错误: src/main.rs:26:25: 26:34 error: `addresses` does not live long eno

如何在
结构中定义可变元素?如果我有以下例子:

struct User>{
让mut addresses=Vec::new();
让mut users=Vec::new();
用户。推送(用户{
引用:“ref.”to_string(),
电子邮件:“test@test.com“.to_string(),
地址:&多个地址
});
使用者
}
…它导致了这个错误:

src/main.rs:26:25: 26:34 error: `addresses` does not live long enough
src/main.rs:26         addresses: &mut addresses
                                       ^~~~~~~~~
src/main.rs:19:37: 31:2 note: reference must be valid for the lifetime 'a as defined on the block at 19:36...
src/main.rs:19 fn get_users<'a>() -> Vec<User<'a>> {
src/main.rs:20 
src/main.rs:21  let mut addresses = Vec::new();
src/main.rs:22     let mut users = Vec::new();
src/main.rs:23     users.push(User {
src/main.rs:24         reference: "ref".to_string(),
               ...
src/main.rs:21:33: 31:2 note: ...but borrowed value is only valid for the block suffix following statement 0 at 21:32
src/main.rs:21  let mut addresses = Vec::new();
src/main.rs:22     let mut users = Vec::new();
src/main.rs:23     users.push(User {
src/main.rs:24         reference: "ref".to_string(),
src/main.rs:25         email: "test@test.com".to_string(),
src/main.rs:26         addresses: &mut addresses
               ...
error: aborting due to previous error
src/main.rs:26:25:26:34错误:`addresses`的寿命不够长
src/main.rs:26个地址:&多个地址
^~~~~~~~~
src/main.rs:19:37:31:2注:引用必须在19:36块上定义的生命周期“a”内有效。。。
src/main.rs:19 fn get_用户>{
src/main.rs:20
src/main.rs:21让mut addresses=Vec::new();
src/main.rs:22让mut users=Vec::new();
src/main.rs:23个用户{
src/main.rs:24引用:“ref.”to_string(),
...
src/main.rs:21:33:31:2注:……但借用值仅对21:32处语句0后面的块后缀有效
src/main.rs:21让mut addresses=Vec::new();
src/main.rs:22让mut users=Vec::new();
src/main.rs:23个用户{
src/main.rs:24引用:“ref.”to_string(),
src/main.rs:25电子邮件:test@test.com“.to_string(),
src/main.rs:26个地址:&多个地址
...
错误:由于上一个错误而中止
我知道这个问题以前已经得到了回答,但我找不到它……如果找到了,请随时将其标记为重复

问题在于,您试图将引用存储在一个容器中,该容器将比该引用更有效。以下是您的问题:

fn main() {
    let mut things = vec![];
    let a = 42;
    things.push(&a);
}
项目按与创建顺序相反的顺序删除,因此
a
会在
things
之前删除。但是,
things
有一个对
a
的引用,这意味着在某个时间点会有一个挂起的引用,这是Rust不允许的。请重新排列您的语句:

fn main() {
    let a = 42;
    let mut things = vec![];
    things.push(&a);
}

你的问题与易变性无关。在发帖之前,尽量将你的问题简化为一个问题。我理解这可能很难,但我保证这将帮助你更好地理解问题,并更快地得到答案。阅读答案,你将来需要这些知识,但对于这个特定的例子您可能不想要
&mut-Vec
。只需将
Vec
存储在
User
中即可。用户对象不会借用和修改其他人的地址列表,每个人都有自己的地址列表并拥有它。@Shepmaster我尽可能地缩小了它。您的回答帮助我修复了缩小的示例,不幸的是,它对我的actu不起作用所有仍然产生相同错误的情况。希望我现在能解决它,因为我在正确的轨道上。谢谢。@Caballero不担心不能一路得到它,只要你尝试一下。我使用了你的示例代码并重新排序了语句,它起了作用。或者你是说你的示例不在问题中?它不是那样工作的。这一整套问题都源于一个来源,即所有权和借用的基本概念,所有这些问题(包括您的问题)都与它们的不同应用有关。在这里,您试图返回对自有结构的借用引用(
Vec
)从一个函数,但是这个拥有的结构是由函数的堆栈框架拥有的,当这个函数返回时,这个结构被破坏,如果允许它返回它,返回的引用将变得悬空。这与其他问题基本相同。
struct User<'a> {
    reference: String,
    email: String,
    addresses: &'a mut Vec<Address>
}

struct Address {
    street: String,
    city: String
}

fn main() {

    let mut users = get_users();

}

fn get_users<'a>() -> Vec<User<'a>> {

    let mut addresses = Vec::new();
    let mut users = Vec::new();
    users.push(User {
        reference: "ref".to_string(),
        email: "test@test.com".to_string(),
        addresses: &mut addresses
    });

    users

}
src/main.rs:26:25: 26:34 error: `addresses` does not live long enough
src/main.rs:26         addresses: &mut addresses
                                       ^~~~~~~~~
src/main.rs:19:37: 31:2 note: reference must be valid for the lifetime 'a as defined on the block at 19:36...
src/main.rs:19 fn get_users<'a>() -> Vec<User<'a>> {
src/main.rs:20 
src/main.rs:21  let mut addresses = Vec::new();
src/main.rs:22     let mut users = Vec::new();
src/main.rs:23     users.push(User {
src/main.rs:24         reference: "ref".to_string(),
               ...
src/main.rs:21:33: 31:2 note: ...but borrowed value is only valid for the block suffix following statement 0 at 21:32
src/main.rs:21  let mut addresses = Vec::new();
src/main.rs:22     let mut users = Vec::new();
src/main.rs:23     users.push(User {
src/main.rs:24         reference: "ref".to_string(),
src/main.rs:25         email: "test@test.com".to_string(),
src/main.rs:26         addresses: &mut addresses
               ...
error: aborting due to previous error
fn main() {
    let mut things = vec![];
    let a = 42;
    things.push(&a);
}
fn main() {
    let a = 42;
    let mut things = vec![];
    things.push(&a);
}