我想实现这样一个Cacher:它的value是Option,它的计算方法可以接收一个泛型I类型的输入,并返回O类型数据。
我的的代码是这样的:
struct Cacher<I, O, C>
where
C: Fn(I) -> O,
{
cal: C,
val: Option<O>,
}
impl<I, O, C> Cacher<I, O, C>
where
C: Fn(I) -> O,
{
fn new(cal: C) -> Cacher<I, O, C> {
Cacher { cal, val: None }
}
fn value(&mut self, input: I) -> O {
match self.val {
None => {
let new_val = (self.cal)(input);
self.val = Some(new_val);
new_val
}
Some(v) => v,
}
}
}
但是,代码的第一行报错:parameter \
I` is never used`
可是我明明已经在where语句里将I指定为Fn的入参类型,为什么还是会报I未使用呢?求大佬解答
1
共 3 条评论, 1 页
评论区
写评论对以下内容的回复:
where其实就是一个trait限定,不算使用吧,如果你把where的那部分去掉放到泛型的部分,其实就应该能明白了,where只是泛型定义的时候的一种限定方式,与结构体内部是否使用了无关。
可是我在where里面用了I呀,难道where里面使用不算使用吗? 对以下内容的回复:
你的结构体里面没有包含I这个泛型,最简单的解决方法是添加一个幽灵数据,类似的情况还有Optional中的生命期如果是None的情况下,也需要幽灵数据来表示,在编译器编译之后会被优化掉的,对性能没有影响