面试题答案
一键面试fn transform<T, F>(value: T, func: F) -> T
where
T: Clone,
F: Fn(T) -> T,
{
func(value.clone())
}
类型约束说明
T: Clone
:添加这个约束是因为在函数体中,我们需要克隆value
,这样func
调用之后原始的value
仍然存在,并且func
函数调用需要一个T
类型的值。如果T
没有实现Clone
,则func
调用时无法获取一个T
类型的值,所以i32
和String
都实现了Clone
,满足这个约束。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
,通过类型约束确保了函数能正确处理i32
和String
类型。