Подробности сообщения об ошибке # 0E207 говорят, что:
Любой параметр типа или параметр времени жизни impl
должен соответствовать хотя бы одному из следующих критериев:
- появляется в типе реализации
impl
, например, impl<T> Foo<T>
- для черты
impl
, появляется в реализованной черте, например, impl<T> SomeTrait<T> for Foo
- он связан как связанный тип, например
impl<T, U> SomeTrait for T where T: AnotherTrait<AssocType=U>
Ничто из этого не относится к вашему T
. То, что вы делаете, в настоящее время не поддерживается.
Это кажется хакерским, но я смог заставить это работать, добавив дополнительные параметры типа в ValueMap, опираясь на фантомных членов данных. Таким образом, каждый из типов встречается в типе реализации, и требования удовлетворяются.
trait Value<T> {
fn get(&self) -> T;
}
struct ValueMap<T, U, S, F>
where
F: Fn(T) -> U,
{
s: S,
f: F,
_t: std::marker::PhantomData<T>,
_u: std::marker::PhantomData<U>,
}
impl<T, U, S, F> Value<U> for ValueMap<T, U, S, F>
where
S: Value<T>,
F: Fn(T) -> U,
{
fn get(&self) -> U {
(self.f)(self.s.get())
}
}
Playground link