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);
}