MST

星途 面试题库

面试题:Rust函数指针类型约束在泛型中的应用

编写一个泛型函数,它接受一个泛型参数`T`和一个函数指针。这个函数指针以`T`类型的值作为参数,返回`T`类型的值。要求对`T`添加合适的类型约束,使得这个函数可以正确处理`i32`和`String`类型。请详细说明如何通过类型约束来确保函数指针的参数和返回值类型与泛型参数`T`匹配。
16.0万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
fn transform<T, F>(value: T, func: F) -> T
where
    T: Clone,
    F: Fn(T) -> T,
{
    func(value.clone())
}

类型约束说明

  1. T: Clone:添加这个约束是因为在函数体中,我们需要克隆value,这样func调用之后原始的value仍然存在,并且func函数调用需要一个T类型的值。如果T没有实现Clone,则func调用时无法获取一个T类型的值,所以i32String都实现了Clone,满足这个约束。
  2. F: Fn(T) -> T:这个约束表明F是一个闭包类型,它接受一个T类型的参数,并返回一个T类型的值。通过这个约束确保了函数指针(闭包)的参数和返回值类型与泛型参数T匹配。这样,无论是i32还是String作为T,闭包都能以正确的类型进行操作。

使用示例

fn main() {
    let num: i32 = 5;
    let result_num = transform(num, |x| x * 2);
    println!("Result for i32: {}", result_num);

    let str_value = String::from("hello");
    let result_str = transform(str_value, |s| s.to_uppercase());
    println!("Result for String: {}", result_str);
}

以上代码定义了一个泛型函数transform,它接受一个泛型参数T和一个函数指针(闭包)func,通过类型约束确保了函数能正确处理i32String类型。