Время жизни ржавчины снова запутывает меня. Я пытаюсь вернуть изменчивую ссылку на объект в коробке, который у меня есть. Вот моя проблема упрощается:as_mut(). Unwrap(): Не удается определить срок службы из-за противоречивых требований.
pub trait Foo {
fn foo(&self);
}
pub struct Bar {
foo: Option<Box<Foo>>,
}
impl Bar {
pub fn foo(&mut self) -> &mut Box<Foo> {
let foo_ref = self.foo.as_mut();
foo_ref.unwrap()
}
pub fn set_foo(&mut self, value: Box<Foo>) {
self.foo = Some(value);
}
}
я получаю эти ошибки, которые я не очень понимаю:
Compiling testproject v0.0.1 (file:///home/virtlink/projects/orion/testproject)
src/lib.rs:15:17: 15:25 error: cannot infer an appropriate lifetime due to conflicting requirements
src/lib.rs:15 foo_ref.unwrap()
^~~~~~~~
src/lib.rs:15:9: 15:25 note: first, the lifetime cannot outlive the method call at 15:8...
src/lib.rs:15 foo_ref.unwrap()
^~~~~~~~~~~~~~~~
src/lib.rs:15:9: 15:16 note: ...so that method receiver is valid for the method call
src/lib.rs:15 foo_ref.unwrap()
^~~~~~~
src/lib.rs:13:44: 16:6 note: but, the lifetime must be valid for the anonymous lifetime #1 defined on the block at 13:43...
src/lib.rs:13 pub fn foo(&mut self) -> &mut Box<Foo> {
src/lib.rs:14 let foo_ref = self.foo.as_mut();
src/lib.rs:15 foo_ref.unwrap()
src/lib.rs:16 }
src/lib.rs:15:9: 15:25 note: ...so that expression is assignable (expected `&mut Box<Foo>`, found `&mut Box<Foo>`)
src/lib.rs:15 foo_ref.unwrap()
^~~~~~~~~~~~~~~~
error: aborting due to previous error
Could not compile `testproject`.
Я не уверен, как решить эту проблему.
Это замечательно, спасибо! Я не знал о жизненной жизни и пробовал 'pub fn foo <'a> (& 'a mut self) -> &' a box Box' безрезультатно. Как я могу потребовать, чтобы тип, реализующий 'Foo', был' 'static'? Я пробовал 'trait Foo <'static>', но это не работает. –
Virtlink
'trait Foo: 'static' –
Возможно, лучшей альтернативой форсированию' 'static' было бы добавить параметр продолжительности жизни в' Bar': 'pub struct Bar <'f> {foo: Option>}'. –
rodrigo