![](/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.