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