比方說,我有一些性狀的類型:實現借<Trait>爲實現特質
trait MyTrait {
fn function1(&self);
}
和某種類型的實現它:
struct MyStruct {
number: i32,
}
impl MyTrait for MyStruct {
fn function1(&self) {
printn!("{}", self.number);
}
}
現在我有另一種類型,它要採取實施MyTrait
的事情。它並不關心他們是否擁有。從周圍閱讀,這聽起來像是正確的方式來完成這個是它需要Borrow<X>
,而不是X
或&X
或其他什麼。這使得它取型X
,或Rc<X>
或Box<X>
,等事情......
我有當X
是一個具體類型這個工作,但我怎麼做時X
是一個特點它的工作?
這是我第一次嘗試:
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
是正確的路要走嗎?如果是這樣,我該如何實現Borrow
的特質?
啊,謝謝!我以前從未見過這個&(MyTrait +'a)'語法。我已經在其他類型的泛型參數中看到過,或者在類型邊界中看到過,但以前從來沒有。 –