面试题答案
一键面试use std::collections::HashSet;
fn main() {
let data: Vec<(String, i32)> = vec![
("Alice".to_string(), 85),
("Bob".to_string(), 78),
("Charlie".to_string(), 90),
("David".to_string(), 75),
];
let result: HashSet<String> = data.into_iter()
.filter(|&(_, score)| score > 80)
.map(|(name, _)| name)
.collect();
println!("{:?}", result);
}
所有权转移和借用规则阐述
-
所有权转移:
- 使用
into_iter
方法时,Vec<(String, i32)>
的所有权被转移到迭代器中。这意味着data
在调用into_iter
后不再有效。 - 在
map
方法中,(name, _)
中的name
(类型为String
)的所有权被转移到HashSet
中。HashSet
现在拥有这些String
的所有权。
- 使用
-
借用规则:
- 在
filter
方法中,使用|&(_, score)| score > 80
,这里使用了不可变借用&
。迭代器中的每个元素(String, i32)
被不可变借用,因为我们只读取score
的值来进行比较,不修改元素本身。这种不可变借用遵循Rust的借用规则,即同一时间可以有多个不可变借用,但不能同时存在可变借用。
- 在
通过这种方式,代码实现了筛选和收集的功能,同时遵循了Rust严格的所有权和借用规则,确保内存安全。