面试题答案
一键面试- 减少不必要的复制和所有权转移
- 思路:如果内层循环中使用的外层循环变量是较大的数据结构,避免在每次内层循环时进行所有权转移或复制。可以通过借用的方式,让内层循环使用外层循环变量的引用。
- 关键代码片段:
fn main() {
let outer_vec = vec![1, 2, 3];
for outer_num in &outer_vec {
let inner_vec = vec![4, 5, 6];
for inner_num in &inner_vec {
if *inner_num > *outer_num {
println!("Inner num {} is greater than outer num {}", inner_num, outer_num);
}
}
}
}
在这个例子中,outer_vec
和 inner_vec
都通过 &
进行借用,避免了所有权转移。
- 提前计算内层循环的条件
- 思路:如果外层循环变量在内层循环条件判断中的计算较为复杂,可以在外层循环提前计算好相关的值,减少内层循环的计算量。
- 关键代码片段:
fn main() {
let outer_vec = vec![1, 2, 3];
for outer_num in &outer_vec {
let outer_num_squared = outer_num * outer_num;
let inner_vec = vec![4, 5, 6];
for inner_num in &inner_vec {
if *inner_num > outer_num_squared {
println!("Inner num {} is greater than outer num squared {}", inner_num, outer_num_squared);
}
}
}
}
这里提前计算了 outer_num
的平方,避免在内层循环每次都进行计算。
- 使用迭代器代替显式循环
- 思路:Rust 的迭代器提供了更高效和简洁的方式来处理循环。迭代器可以利用 Rust 的惰性求值特性,并且在处理复杂逻辑时,代码可能更具可读性和性能优势。
- 关键代码片段:
fn main() {
let outer_vec = vec![1, 2, 3];
outer_vec.iter().for_each(|outer_num| {
let inner_vec = vec![4, 5, 6];
inner_vec.iter().for_each(|inner_num| {
if *inner_num > *outer_num {
println!("Inner num {} is greater than outer num {}", inner_num, outer_num);
}
});
});
}
通过 iter()
方法获取迭代器,然后使用 for_each
方法进行循环操作。
- 减少可变借用的范围
- 思路:如果外层循环变量需要在内层循环中可变借用,尽量缩小可变借用的范围,以避免借用检查器限制优化的可能性。
- 关键代码片段:
fn main() {
let mut outer_num = 5;
let inner_vec = vec![1, 2, 3];
for inner_num in &inner_vec {
{
let mut outer_num_ref = &mut outer_num;
*outer_num_ref += 1;
}
if *inner_num < outer_num {
println!("Inner num {} is less than outer num {}", inner_num, outer_num);
}
}
}
这里通过花括号限制了 outer_num
可变借用的范围,使得在后续的条件判断中可以正常使用不可变借用的规则。