我具有这种通用类型:
pub struct MyContainer<T, S> {
array: Vec<T>,
get_size: S,
size: u32,
}
impl<T: Default, S> MyContainer<T, S>
where
S: Fn(&T) -> u32,
{
pub fn new(size: u32, get_size: S) -> MyContainer<T, S> {
let array = Vec::with_capacity(size as usize);
MyContainer {
array,
get_size,
size,
}
}
}
我可以使用编译器推论魔术轻松地创建一个容器:
pub fn get_size_func(h: &House) -> u32 {
h.num_rooms
}
let container = MyContainer::new(6, get_size);
但是,当我尝试在另一个结构中实例化我的泛型类型时,我遇到了一个问题:
pub struct City {
suburbs: MyContainer<House, fn(&House) -> u32>,
}
impl City {
pub fn new(num_houses: u32) -> City {
let container = MyContainer::new(num_houses, get_size_func);
City { suburbs: container }
}
}
我知道
error[E0308]: mismatched types
--> src/lib.rs:44:25
|
44 | City { suburbs: container }
| ^^^^^^^^^ expected fn pointer, found fn item
|
= note: expected type `MyContainer<_, for<'r> fn(&'r House) -> u32>`
found type `MyContainer<_, for<'r> fn(&'r House) -> u32 {get_size_func}>`
答案 0 :(得分:1)
这个问题有两个答案:
在创建容器时指定类型参数。我不知道为什么行得通,但是行得通:
explode
您还可以定义一个泛型函数,以调用泛型特征以增加踢力。例如:
let container = MyContainer::<House, fn(&House) -> u32>::new(num_houses, get_size_func);
let container = MyContainer::<House, fn(&House) -> u32>::new(num_houses, get_size_func2::<House>);
将是特征绑定泛型函数。
这里是the full playground。对于这两种解决方案,类型参数都是必需的,而不是在get_size_func2
函数中推导的。