Почему я не могу сделать входной аргумент универсальным - PullRequest
0 голосов
/ 05 марта 2019

Я следую вместе с языком программирования 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, но я не совсем им следую.Может кто-нибудь объяснить простыми словами?:)

...