面试题答案
一键面试use std::collections::HashMap;
fn process_data(data: Vec<(String, i32)>) {
let mut groups: HashMap<String, Vec<i32>> = HashMap::new();
// 分组数据
for (name, value) in data {
groups.entry(name).or_insert_with(Vec::new).push(value);
}
// 定义嵌套函数进行统计计算
fn calculate_stats(group: &[i32]) -> (f64, i32) {
let sum: i32 = group.iter().sum();
let avg = if group.len() > 0 { sum as f64 / group.len() as f64 } else { 0.0 };
(avg, sum)
}
// 对每组数据进行统计计算
for (name, group) in groups.into_iter() {
let (avg, sum) = calculate_stats(&group);
println!("Name: {}, Average: {}, Sum: {}", name, avg, sum);
}
}
嵌套函数适用于这种场景的原因:
- 封装性:嵌套函数可以将特定的计算逻辑封装在主函数内部,使得主函数的逻辑更加清晰,外部代码无法直接访问嵌套函数,增强了代码的安全性和模块化。
- 作用域控制:嵌套函数只能在其外部函数内部被调用,其作用域被限制在外部函数内,避免了命名冲突,特别是在处理复杂任务时,不同的逻辑模块可以使用相同的内部函数名而不会相互干扰。
- 数据共享:嵌套函数可以直接访问外部函数的局部变量,在这个场景中,
calculate_stats
函数可以直接使用group
数据,而无需将数据作为参数层层传递,提高了代码的简洁性和效率。