use std::fmt::Debug;
// 定义Processor结构体
struct Processor<T> {
insert_func: Box<dyn FnMut(&mut Vec<T>, T) where T: Clone + Debug>,
}
// 实现Processor实例化函数
fn create_processor<T>() -> Processor<T>
where
T: Clone + Debug,
{
Processor {
insert_func: Box::new(|vec, value| {
vec.push(value.clone());
}),
}
}
// 测试函数
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_insertion() {
let mut processor = create_processor::<i32>();
let mut vec: Vec<i32> = Vec::new();
let value = 42;
(processor.insert_func)(&mut vec, value);
assert_eq!(vec, vec![42]);
}
}
函数指针类型约束处理
- 定义函数指针类型:在
Processor
结构体中,定义了insert_func
成员,类型为Box<dyn FnMut(&mut Vec<T>, T)>
。这表示该函数指针指向一个接受可变&mut Vec<T>
和T
类型值的函数,并且该函数是可变调用的。
- 实例化时类型绑定:在
create_processor
函数中,通过Box::new
将具体的插入逻辑封装成函数指针实例。这里具体的逻辑是将传入的值克隆后插入到Vec
中,因为函数指针的类型要求,必须满足T: Clone
,所以这里使用clone
方法。
满足T
的额外trait约束
- trait约束声明:在
Processor
结构体定义以及create_processor
函数定义处,都声明了where T: Clone + Debug
。这确保了T
类型必须实现Clone
和Debug
trait。
- 具体使用场景:在插入逻辑中,因为需要对
T
类型的值进行复制并插入到Vec
中,所以T
必须实现Clone
trait。而在测试函数中,assert_eq!
宏在比较Vec
内容时,如果T
类型实现了Debug
trait,会有更好的调试输出,方便发现测试失败的原因。