繁体   English   中英

当 args 不受约束时,如何为实现 trait Fn 的类型指定泛型参数?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM