此代码片段的编译:
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>> {
| ++++
我模糊地理解,我必须以某种方式告诉它,Base
和OnBase
的生命周期应该是相同的,但即使我把'a
添加到所有的特性和引用中,它仍然失败。
有没有可能用某种方法编译它?
另外,如果get_a返回普通的A
,它就可以工作。
pps-在真正的应用程序中,它应该是一种策略,可以将任务委托给它封装的任何impl
playground
1条答案
按热度按时间ukxgm1gy1#
这可能是您真正想要的,而不是
T = dyn OnBase<T = T>
:但是我不确定
OnBase: Base
的用途。如果OnBase
已经是Base
了,那么为什么还要做这些呢?它应该在get_p
中返回什么呢?使用当前的布局,很容易陷入无限的get_a
递归中。