为什么我不能使输入参数通用

时间:2019-03-05 09:12:10

标签: generics rust

我将跟随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,但我不太关注他们。有人可以简单地解释吗? :)

0 个答案:

没有答案