簡體   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