< 返回版块

dee-qi 发表于 2020-05-24 16:20

Tags:萌新求助

我想实现这样一个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未使用呢?求大佬解答

评论区

写评论
Cupnfish 2020-05-24 19:31

对以下内容的回复:

where其实就是一个trait限定,不算使用吧,如果你把where的那部分去掉放到泛型的部分,其实就应该能明白了,where只是泛型定义的时候的一种限定方式,与结构体内部是否使用了无关。

作者 dee-qi 2020-05-24 18:12

可是我在where里面用了I呀,难道where里面使用不算使用吗? 对以下内容的回复:

Cupnfish 2020-05-24 16:46

你的结构体里面没有包含I这个泛型,最简单的解决方法是添加一个幽灵数据,类似的情况还有Optional中的生命期如果是None的情况下,也需要幽灵数据来表示,在编译器编译之后会被优化掉的,对性能没有影响

1 共 3 条评论, 1 页