编译器无法推断 `impl <trait>` 的对象是否在 Rust 中实现了另一个特征
Compiler cannot infer if an object of `impl <trait>` has impled another trait in Rust
假设我有一个特征 A
并且我有很多 结构 (例如 X
)实现 A
。然后我写了很多小函数(return 这些结构)来抽象我的逻辑。但是,这些函数的 return 类型可能非常庞大
写起来很复杂(比如 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
。每当我想使用由我的小函数编辑的值 return 作为:func_to_return_impl_A(...).method_of_trait_B(...)
,编译器就会抱怨:no implementation for impl A <method of trait B> ...
。此外,我不能简单地将 return 类型重写为 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
,但是随着模型变得越来越复杂,这将很难维护.我该如何解决这个问题?
好的,我想我已经找到了针对我的问题的临时解决方案:附加 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> {...}
然后我可以使用 trait B
:
的方法
func_to_return_impl_A().method_of_trait_B(...);
假设我有一个特征 A
并且我有很多 结构 (例如 X
)实现 A
。然后我写了很多小函数(return 这些结构)来抽象我的逻辑。但是,这些函数的 return 类型可能非常庞大
写起来很复杂(比如 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
。每当我想使用由我的小函数编辑的值 return 作为:func_to_return_impl_A(...).method_of_trait_B(...)
,编译器就会抱怨:no implementation for impl A <method of trait B> ...
。此外,我不能简单地将 return 类型重写为 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
,但是随着模型变得越来越复杂,这将很难维护.我该如何解决这个问题?
好的,我想我已经找到了针对我的问题的临时解决方案:附加 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> {...}
然后我可以使用 trait B
:
func_to_return_impl_A().method_of_trait_B(...);