![](/img/trans.png)
[英]How to not specify the type argument in a generic method when the required argument is null?
[英]How to specify a generic argument for a type that implements trait Fn when the args are not constrained?
我正在尝试使用“地图”概念来实现一个特征。 我想出了以下最小示例:
trait Value<T> {
fn get(&self) -> T;
}
struct ValueMap<S, F> {
s: S,
f: F,
}
impl<T, U, S: Value<T>, F: Fn(T) -> U> Value<U> for ValueMap<S, F> {
fn get(&self) -> U {
(self.f)(self.s.get())
}
}
我收到错误the type parameter
T is not constrained by the impl trait, self type, or predicates
。
当F
是一个将值S
映射到其他东西的函数时,如何为我的ValueMap
结构实现Value
特征?
备注:当我在 Value 上使用关联类型时,我没有这个问题。 但是这些概念对我来说仍然有点模糊。
错误消息#0E207的详细信息说:
impl
任何类型参数或生命周期参数必须至少满足以下条件之一:
- 它出现在
impl
的实现类型中,例如impl<T> Foo<T>
- 对于 trait
impl
,它出现在已实现的 trait 中,例如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())
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.