面试题答案
一键面试在Rust中,可以这样定义和实现泛型trait
:
// 定义泛型trait
trait MyTrait<T, U> {
fn execute<F>(&self, closure: F) -> U
where
F: Fn(T) -> U;
}
// 定义结构体来实现MyTrait
struct MyStruct;
// 使用impl关键字实现MyTrait
impl MyTrait<i32, f64> for MyStruct {
fn execute<F>(&self, closure: F) -> f64
where
F: Fn(i32) -> f64,
{
closure(42)
}
}
解释
- 泛型:在
trait
定义MyTrait<T, U>
中,T
和U
是泛型类型参数。T
是闭包接受的参数类型,U
是闭包返回的结果类型。这使得trait
可以适用于多种不同类型的组合。 - trait:
MyTrait
定义了一个方法execute
,该方法接受一个闭包closure
作为参数,并返回类型U
。闭包closure
必须满足Fn(T) -> U
的约束,即接受类型T
的参数并返回类型U
的结果。 - 闭包:闭包作为
execute
方法的参数,其类型F
被约束为Fn(T) -> U
。在实现中,闭包接受一个i32
类型参数并返回一个f64
类型结果。 - impl关键字:使用
impl MyTrait<i32, f64> for MyStruct
,表示为MyStruct
结构体实现MyTrait
,其中T
被指定为i32
,U
被指定为f64
。execute
方法的实现遵循trait
中定义的签名,调用闭包并返回其结果。
通过这种方式,利用泛型、trait和闭包的特性,结合impl
关键字完成了这一复杂设计,使代码具有高度的灵活性和复用性。