假设我有一些特性:
trait MyTrait {
fn function1(&self);
}
和实现它的某种类型:
struct MyStruct {
number: i32,
}
impl MyTrait for MyStruct {
fn function1(&self) {
printn!("{}", self.number);
}
}
现在我有另一种类型,想要使用实现 MyTrait
的物品。它不关心它们是否被拥有。从阅读周围的内容来看,似乎实现这个的正确方法是让它取代 X
或 &X
,或任何其他东西,接受 Borrow<X>
。这使得它可以获取 X
、Rc<X>
或 Box<X>
等类型的物品。
当 X
是一个具体类型时,我已经做到了这一点,但当 X
是一个 trait 时,该怎么办呢?
以下是我首先尝试的:
struct Consumer<T> {
inner: T
}
impl<T: Borrow<MyTrait>> Consumer<T> {
pub fn new(inner: T) -> Consumer<T> {
Consumer {
inner: inner
}
}
pub fn do_stuff(&self) {
self.inner.borrow().function1();
}
}
fn main() {
// I want to eventually be able to swap this out for x = Rc::new(MyStruct ...
// but I'll keep it simple for now.
let x = MyStruct { number: 42 };
let c = Consumer::new(x);
c.do_stuff();
}
目前这还不能工作,因为MyStruct
实现了Borrow<MyStruct>
,但没有实现Borrow<MyTrait>
。好的,让我们尝试实现它:
impl Borrow<MyTrait> for MyStruct {
fn borrow(&self) -> &MyTrait {
self
}
}
这导致了以下错误,我不理解:
<anon>:33:5: 35:6 error: method `borrow` has an incompatible type for trait:
expected bound lifetime parameter ,
found concrete lifetime [E0053]
<anon>:33 fn borrow(&self) -> &MyTrait {
<anon>:34 self
<anon>:35 }
<anon>:33:5: 35:6 help: see the detailed explanation for E0053
error: aborting due to previous error
playpen: application terminated with error code 101
什么?这里没有提到任何具体的生命周期,而且“Borrow”也没有定义任何生命周期。我很困惑。首先,我的假设是使用“Borrow”是正确的方法吗?如果是,那么如何实现一个trait的“Borrow”呢?
&(MyTrait + 'a)
语法。我之前在其他类型的泛型参数或类型边界中看到过它,但从未单独使用过。 - Bill Fraser