面试题答案
一键面试// 定义一个接受实现了Fn trait的参数的函数
fn call_with_fn<F: Fn(i32) -> i32>(func: F) {
let result = func(5);
println!("Result: {}", result);
}
fn main() {
// 创建一个闭包,实现复杂的逻辑计算
let closure = |x: i32| {
// 这里可以编写复杂的逻辑
let a = x * 2;
let b = a + 3;
b - 1
};
// 将闭包传递给函数
call_with_fn(closure);
}
代码解释
-
定义接受Fn trait参数的函数:
fn call_with_fn<F: Fn(i32) -> i32>(func: F)
定义了一个泛型函数call_with_fn
,它接受一个实现了Fn(i32) -> i32
trait 的参数func
。这意味着func
是一个可调用对象,接受一个i32
类型的参数并返回一个i32
类型的值。- 在函数内部,调用
func(5)
并打印结果。
-
创建闭包:
let closure = |x: i32| { ... };
创建了一个闭包。闭包的参数类型是i32
,返回类型也是i32
,与call_with_fn
函数要求的Fn
trait 签名匹配。- 在闭包内部,实现了复杂的逻辑计算。首先将参数
x
乘以2,然后加上3,最后减去1。
-
传递闭包给函数:
call_with_fn(closure);
将闭包closure
传递给call_with_fn
函数,从而满足函数对Fn
trait 参数的要求。
由于闭包捕获的环境(这里没有捕获任何外部变量)和参数传递都是按值进行的,所以避免了生命周期或借用检查问题。如果闭包需要捕获外部变量,Rust 的借用检查器会确保这些借用的生命周期是正确的,并且不会导致悬垂引用等问题。