如何在一个结构体中定义可变元素?如果我有以下示例:
我仍然遇到了类似的错误:
struct User<'a> {
reference: String,
email: String,
addresses: &'a mut Vec<Address>
}
struct Address {
street: String,
city: String
}
fn main() {
let mut users = Vec::new();
users.push(User {
reference: "ref".to_string(),
email: "test@test.com".to_string(),
addresses: &mut Vec::new()
});
}
...它会产生一个错误:
src/main.rs:18:19: 18:29 error: borrowed value does not live long enough
src/main.rs:18 addresses: &mut Vec::new()
^~~~~~~~~~
src/main.rs:14:29: 21:2 note: reference must be valid for the block suffix following statement 0 at 14:28...
src/main.rs:14 let mut users = Vec::new();
src/main.rs:15 users.push(User {
src/main.rs:16 reference: "ref".to_string(),
src/main.rs:17 email: "test@test.com".to_string(),
src/main.rs:18 addresses: &mut Vec::new()
src/main.rs:19 });
...
src/main.rs:15:2: 19:5 note: ...but borrowed value is only valid for the statement at 15:1
src/main.rs:15 users.push(User {
src/main.rs:16 reference: "ref".to_string(),
src/main.rs:17 email: "test@test.com".to_string(),
src/main.rs:18 addresses: &mut Vec::new()
src/main.rs:19 });
src/main.rs:15:2: 19:5 help: consider using a `let` binding to increase its lifetime
src/main.rs:15 users.push(User {
src/main.rs:16 reference: "ref".to_string(),
src/main.rs:17 email: "test@test.com".to_string(),
src/main.rs:18 addresses: &mut Vec::new()
src/main.rs:19 });
error: aborting due to previous error
如果我采纳编译器的建议 help: consider using a let binding to increase its lifetime
:
...并考虑使用let绑定来增加其生命周期:
fn main() {
let mut users = Vec::new();
let mut addresses = Vec::new();
users.push(User {
reference: "ref".to_string(),
email: "test@test.com".to_string(),
addresses: &mut addresses
});
}
我仍然遇到了类似的错误:
...
src/main.rs:19:19: 19:28 error: `addresses` does not live long enough
src/main.rs:19 addresses: &mut addresses
^~~~~~~~~
src/main.rs:14:29: 22:2 note: reference must be valid for the block suffix following statement 0 at 14:28...
src/main.rs:14 let mut users = Vec::new();
src/main.rs:15 let mut addresses = Vec::new();
src/main.rs:16 users.push(User {
src/main.rs:17 reference: "ref".to_string(),
src/main.rs:18 email: "test@test.com".to_string(),
src/main.rs:19 addresses: &mut addresses
...
src/main.rs:15:33: 22:2 note: ...but borrowed value is only valid for the block suffix following statement 1 at 15:32
src/main.rs:15 let mut addresses = Vec::new();
src/main.rs:16 users.push(User {
src/main.rs:17 reference: "ref".to_string(),
src/main.rs:18 email: "test@test.com".to_string(),
src/main.rs:19 addresses: &mut addresses
src/main.rs:20 });
...
error: aborting due to previous error
这里有什么问题?
更新: 所以这个情况实际上更接近于我的问题:
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
&mut Vec
。只需在User
中存储一个Vec
即可。用户对象不借用和修改其他人的地址列表,每个用户都有自己的地址列表并拥有它。 - user395760Vec<Address>
)的借用引用,但是该拥有结构由函数的堆栈帧拥有,当此函数返回时,该结构将被销毁,并且如果允许返回,则返回的引用将变为悬空引用。这与其他问题本质上是相同的。 - Vladimir Matveev