struct Person {
name: String,
age: u32,
}
fn main() {
let mut people: Vec<Box<Person>> = Vec::new();
people.push(Box::new(Person { name: "Alice".to_string(), age: 30 }));
people.push(Box::new(Person { name: "Bob".to_string(), age: 25 }));
let removed_person = match people.pop() {
Some(person) => person,
None => {
println!("Vec is empty");
return;
}
};
println!("Removed person: name = {}, age = {}", removed_person.name, removed_person.age);
}
- 结构体定义:首先定义了
Person
结构体,包含name
(字符串类型)和age
(u32
类型)两个字段。
- 存储实例:创建一个
Vec<Box<Person>>
类型的people
向量,并向其中添加Person
实例。这里使用Box
是因为Person
中包含String
类型,Box
允许在堆上分配内存。
- 取出并转移所有权:使用
match
表达式结合pop
方法从Vec
中取出最后一个元素。如果Vec
不为空,pop
返回Some(Person)
,此时将Person
的所有权转移到removed_person
变量中;如果Vec
为空,pop
返回None
,打印提示信息并结束程序。
- 避免内存泄漏和悬空指针:
pop
方法在取出元素后会将其从Vec
中移除,因此不会造成内存泄漏。同时,由于Person
的所有权被转移,不存在悬空指针问题。