我将跟随Rust编程语言https://doc.rust-lang.org/book/,并在第13章关于闭包的过程中,尝试使示例代码使用泛型。
我可以使输出值具有以下通用性:
struct Cacher<T, V>
where T: Fn(u32) -> V
{
calculation: T,
value: Option<V>,
}
impl <T, V> Cacher<T, V>
where T: Fn(u32) -> V
{
fn new(calculation: T) -> Cacher<T, V> {
Cacher {
calculation,
value: None,
}
}
}
impl <T> Cacher<T, u32>
where T: Fn(u32) -> u32
{
fn value(&mut self, arg: u32) -> u32 {
match self.value {
Some(v) => v,
None => {
let v = (self.calculation)(arg);
self.value = Some(v);
v
},
}
}
}
但是当我尝试使输入通用时:
struct Cacher<T, I, V>
where T: Fn(I) -> V
{
calculation: T,
value: Option<V>,
}
impl <T, I, V> Cacher<T, I, V>
where T: Fn(I) -> V
{
fn new(calculation: T) -> Cacher<T, I, V> {
Cacher {
calculation,
value: None,
}
}
}
impl <T> Cacher<T, u32, u32>
where T: Fn(u32) -> u32
{
fn value(&mut self, arg: u32) -> u32 {
match self.value {
Some(v) => v,
None => {
let v = (self.calculation)(arg);
self.value = Some(v);
v
},
}
}
}
...我得到E0392 parameter 'I' is never used
。
我可以理解,I
并不是定义结构Cacher
的一部分,但是我还没有找到告诉编译器“ T
是使用一个参数并返回V
“的闭包。
我已经看到一些与此相关的讨论,例如PhantomData
,但我不太关注他们。有人可以简单地解释吗? :)