MST

星途 面试题库

面试题:Rust函数中的闭包作为参数

编写一个Rust函数,该函数接受一个闭包作为参数。闭包接受两个浮点数并返回它们的乘积。在主函数中,调用这个接受闭包参数的函数,并传入一个符合要求的闭包,输出计算结果。请解释闭包在Rust中的作用以及它和普通函数的区别。
38.2万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
// 接受闭包作为参数的函数
fn multiply_with_closure(closure: impl Fn(f64, f64) -> f64) -> f64 {
    closure(2.0, 3.0)
}

fn main() {
    let result = multiply_with_closure(|a, b| a * b);
    println!("计算结果: {}", result);
}

闭包在Rust中的作用

  1. 灵活的代码块传递:闭包允许将一段代码作为参数传递给其他函数,使得代码更加模块化和可复用。例如,在multiply_with_closure函数中,通过传递闭包来决定具体的乘法逻辑,提高了函数的通用性。
  2. 捕获环境变量:闭包可以捕获其定义时所在作用域中的变量。这使得闭包能够在不同的上下文中使用相同的逻辑,同时结合不同的环境数据。

闭包和普通函数的区别

  1. 语法
    • 闭包:使用|参数列表| {代码块}的语法定义,较为简洁。例如|a, b| a * b
    • 普通函数:使用fn函数名(参数列表) -> 返回类型 {代码块}的语法定义,更加正式和详细。例如fn add(a: i32, b: i32) -> i32 { a + b }
  2. 捕获环境变量
    • 闭包:可以自动捕获其定义时所在作用域中的变量,形成一个“环境”。
    • 普通函数:不能捕获环境变量,只能通过参数来接收外部数据。
  3. 类型推断
    • 闭包:闭包的类型通常由编译器根据上下文自动推断,开发者无需显式标注。
    • 普通函数:函数的参数和返回类型都需要显式声明。
  4. 可调用性
    • 闭包:闭包实现了FnFnMutFnOnce这三个trait之一,根据对环境变量的借用情况决定实现哪个trait。
    • 普通函数:普通函数实现了Fn trait,可以直接调用。