gpt4 book ai didi

rust - 编译器无法推断 `impl ` 的对象是否在 Rust 中实现了另一个特征

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

假设我有一个特质 A我有很多结构(例如X)实现了A .然后我写了很多小函数(返回这些结构)来抽象我的逻辑。但是,这些函数的返回类型可能非常庞大写起来很复杂(比如 Chain<Map<'a, (i32, u8), u16, Enumerate<Filter<'a, u8, vec::MoveItems<u8>>>>, SkipWhile<'a, u16, Map<'a, &u16, u16, slice::Items<u16>>>> ),所以我用了 impl A相反,据我所知,impl <trait>s仍然是静态调度:

trait A {...}
struct X {...}
impl A for X {...}
fn func_to_return_impl_A() -> impl A {...}

现在的问题是,最近我想将我的结构 应用于另一个特征B .每当我想使用我的小函数返回的值时:func_to_return_impl_A(...).method_of_trait_B(...) ,编译器提示:no implementation for impl A <method of trait B> ... .此外,我不能简单地将返回类型重写为 impl A + B。自特征 B还可能包含我自己无法编写的复杂泛型类型或关联类型:

impl B for X {...}

fn some_func() {
func_to_return_impl_A().method_of_trait_B(...) //error: no implementation for impl A <method of trait B> ...
}

我能想到的避免这种情况的唯一方法是制作另一个包装器来包装我所有的结构并将其实现为特征 B ,但是随着模型变得越来越复杂,这将很难维护。我该如何解决这个问题?

最佳答案

好的,我想我已经找到了针对我的问题的临时解决方案:额外的 Wrapper:

struct Wrapper<P: A> {
p: P
}

impl<P: A> A for Wrapper<P> {...}
impl<P: A> B for Wrapper<P> {...}

fn func_to_return_impl_A() -> Wrapper<impl A> {...}

然后我可以使用特征 B 的方法:

func_to_return_impl_A().method_of_trait_B(...);

关于rust - 编译器无法推断 `impl <trait>` 的对象是否在 Rust 中实现了另一个特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66668152/

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