rust 返回引用的Blanket实现失败,并显示“参数类型'T'可能生存时间不够长”

toe95027  于 2023-02-08  发布在  其他
关注(0)|答案(1)|浏览(151)

此代码片段的编译:

trait Base {
    type T;

    fn get_p(&self) -> &Self::T;
}

trait OnBase: Base {
    fn get_a(&self) -> &A;
}

impl<S, T> OnBase for S
where
    S: Base<T = dyn OnBase<T = T>>,
{
    fn get_a(&self) -> &A {
        self.get_p().get_a()
    }
}

struct A {}

失败原因:

error[E0311]: the parameter type `T` may not live long enough
  --> src/blanket_with_ref.rs:17:9
   |
17 |         self.get_p().get_a()
   |         ^^^^^^^^^^^^
   |
note: the parameter type `T` must be valid for the anonymous lifetime defined here...
  --> src/blanket_with_ref.rs:16:14
   |
16 |     fn get_a(&self) -> &A {
   |              ^^^^^
note: ...so that the type `T` will meet its required lifetime bounds
  --> src/blanket_with_ref.rs:17:9
   |
17 |         self.get_p().get_a()
   |         ^^^^^^^^^^^^
help: consider adding an explicit lifetime bound...
   |
14 | impl <S, T: 'a> OnBase for S where S:Base<T=dyn OnBase<T=T>> {
   |           ++++

我模糊地理解,我必须以某种方式告诉它,BaseOnBase的生命周期应该是相同的,但即使我把'a添加到所有的特性和引用中,它仍然失败。
有没有可能用某种方法编译它?
另外,如果get_a返回普通的A,它就可以工作。
pps-在真正的应用程序中,它应该是一种策略,可以将任务委托给它封装的任何impl
playground

ukxgm1gy

ukxgm1gy1#

这可能是您真正想要的,而不是T = dyn OnBase<T = T>

trait Base {
    type T;

    fn get_p(&self) -> &Self::T;
}

trait OnBase: Base {
    fn get_a(&self) -> &A;
}

impl<S> OnBase for S
where
    S: Base,
    <S as Base>::T: OnBase,
{
    fn get_a(&self) -> &A {
        self.get_p().get_a()
    }
}

struct A;

但是我不确定OnBase: Base的用途。如果OnBase已经是Base了,那么为什么还要做这些呢?它应该在get_p中返回什么呢?使用当前的布局,很容易陷入无限的get_a递归中。

相关问题