首页 > 解决方案 > 为什么我不能使输入参数通用

问题描述

我正在关注 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但我不太关注它们。有人可以简单地解释一下吗?:)

标签: genericsrust

解决方案


推荐阅读