struct Person {
name: String,
age: u32,
}
fn main() {
let people: Vec<Person> = vec![
Person { name: "Alice".to_string(), age: 25 },
Person { name: "Bob".to_string(), age: 35 },
Person { name: "Charlie".to_string(), age: 28 },
];
let names: Vec<String> = people.into_iter()
.map(|person| {
if person.age > 30 {
person.name.to_uppercase()
} else {
person.name
}
})
.collect();
println!("{:?}", names);
}
所有权和借用规则说明
- 所有权转移:
- 这里使用了
into_iter
,它会消耗掉people
向量,因为into_iter
获取了people
的所有权。这意味着people
在调用into_iter
后不再有效,所有权转移到了迭代器中。
- 在
map
闭包中,person
接收到Person
实例的所有权。因为闭包获取了person
的所有权,所以在闭包内可以对person
进行操作,如访问name
字段并在必要时转换为大写。由于person
的所有权被闭包获取,所以person
在闭包结束后也不再有效。
- 借用规则:
- 整个过程中没有使用借用,因为如果使用
iter
(借用迭代器),闭包参数会是&Person
,这就需要考虑借用生命周期等问题。而这里使用into_iter
直接转移所有权,避免了复杂的借用规则。但如果使用借用,要保证借用的生命周期不超过被借用对象的生命周期,并且同一时间只能有一个可变借用或者多个不可变借用,不能同时存在可变和不可变借用,以避免数据竞争。