Игнорирование первой ошибки о типах без размера, обе вторые две ошибки относятся к одной и той же проблеме: «невозможно удалить из заимствованного содержимого» * 1001 *
Этот меньший пример вызывает ту же ошибку:
struct Inner {}
impl Inner {
// consumes self. requires ownership
fn foo(self) -> u64 {
42
}
}
fn main() {
let my_inner = Inner {};
let borrow = &my_inner;
let answer = borrow.foo(); // oops! we are using a borrowed version that we don't own
println!("meaning of life {}", answer);
}
Для получения дополнительной информации см. этот ответ , в частности, часть о владении, или см. четвертую главу книги о ржавчине .
Специально для вашей проблемы одно решениеизменить trait T
так, чтобы он заимствовал только свой аргумент:
trait T {
fn foo(&self) -> u64; // notice the change: `self` -> `&self`
}
// ...
impl T for Inner {
fn foo(&self) -> u64 { // notice the change: `self` -> `&self`
42
}
}
// ...
impl<'a> T for Outer<'a> {
fn foo(&self) -> u64 { // notice the change: `self` -> `&self`
self.delegate.foo()
}
}
// ...