[英]Compiler cannot infer if an object of `impl <trait>` has impled another trait in Rust
考虑我有一个特征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
是仍然发送 static:
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
,因为 trait 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
中,但是随着 model 变得越来越复杂,这将很难维护。 我应该如何解决这个问题?
好的,我想我已经为我的问题找到了临时解决方案:附加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(...);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.