面试题答案
一键面试use std::default::Default;
// 定义泛型结构体
struct Container<T> {
value: T,
}
// 为Container<T>实现方法
impl<T> Container<T> {
// 构造函数
fn new(value: T) -> Self {
Container { value }
}
// map方法
fn map<U, F>(self, f: F) -> Container<U>
where
F: FnOnce(T) -> U,
{
Container { value: f(self.value) }
}
// filter方法
fn filter<F>(self, f: F) -> Container<T>
where
F: FnOnce(&T) -> bool,
T: Default,
{
if f(&self.value) {
self
} else {
Container::new(Default::default())
}
}
}
实现思路
- 定义结构体:定义一个泛型结构体
Container<T>
,包含一个字段value: T
,用于存储任意类型的值。 - 实现
new
方法:为Container<T>
实现一个new
方法,用于创建Container
实例。 - 实现
map
方法:map
方法接受一个闭包f
,该闭包接受类型为T
的参数,并返回类型为U
的值。map
方法调用闭包f
,将self.value
作为参数传入,并返回一个新的Container<U>
实例,其中U
是闭包返回的类型。 - 实现
filter
方法:filter
方法接受一个闭包f
,该闭包接受类型为&T
的参数,并返回一个bool
值。filter
方法调用闭包f
,将&self.value
作为参数传入,如果闭包返回true
,则返回self
,否则返回一个Container<T>
的默认值(假设T
实现了Default
trait)。
类型约束的作用
map
方法的类型约束:F: FnOnce(T) -> U
:这个类型约束确保闭包f
接受类型为T
的参数,并返回类型为U
的值。这保证了闭包返回的类型与Container
中的泛型类型兼容,使得map
方法可以正确地返回一个新的Container<U>
实例。
filter
方法的类型约束:F: FnOnce(&T) -> bool
:这个类型约束确保闭包f
接受类型为&T
的参数,并返回一个bool
值,用于判断self.value
是否满足条件。T: Default
:这个类型约束确保类型T
实现了Default
trait,以便在filter
方法中当闭包返回false
时,可以创建一个Container<T>
的默认值。
通过这些类型约束,Rust编译器可以在编译时检查代码的类型安全性,确保程序在运行时不会出现类型错误。同时,这些约束也使得map
和filter
方法具有通用性,可以应用于不同类型的Container
实例。