gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:30:12 24 4
gpt4 key购买 nike

我正在尝试使用“ map ”概念来实现一个特征。我想出了以下最小示例:

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电话 is not constrained by the impl trait, self type, or predicates .

我该如何实现 Value我的特质 ValueMap结构时 F是一个映射值 S 的函数到别的东西?

备注:当我在 Value 上使用关联类型时,我没有这个问题。但是这些概念对我来说仍然有点模糊。

最佳答案

错误信息的详细信息 #0E207比如说:

Any type parameter or lifetime parameter of an impl must meet at least one of the following criteria:

  • it appears in the implementing type of the impl, e.g. impl<T> Foo<T>
  • for a trait impl, it appears in the implemented trait, e.g. impl<T> SomeTrait<T> for Foo
  • it is bound as an associated type, e.g. 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

关于generics - 当 args 不受约束时,如何为实现 trait Fn 的类型指定泛型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60593650/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com