Это произошло из-за причуды в компиляторе.Давайте расширим время жизни в borrow_mut
:
fn borrow_mut<'a>(&'a mut self) -> Option<&'a mut dyn Baz> {
Выражение
self.data.as_mut().map(|x| &mut **x)
было выведено, чтобы иметь тип Option<&mut dyn (Baz + 'static)>
, в то время как функция ожидала вывода Option<&'a mut dyn (Baz + 'a)>
.Это тонкое различие в ограничениях времени жизни, применяемых к объекту признака, не может быть разрешено простым принуждением, потому что изменяемые ссылки инвариантны относительно времени жизни объекта признака.
Что мы можем сделать, это либо согласиться на вывод изменяемой ссылки на dyn Baz + 'static
:
fn borrow_mut<'a>(&'a mut self) -> Option<&'a mut (dyn Baz + 'static)> {
self.data.as_mut().map(|x| x.as_mut())
}
Или скажите компилятору разрешить выражение в Option<&'a mut (dyn Baz + 'a)>
другими способами, например, с помощью оператора match
, оператора ?
или оператора приведения.
impl Bar {
fn borrow_mut(&mut self) -> Option<&mut dyn Baz> {
self.data.as_mut().map(|x| &mut **x as &mut dyn Baz)
}
}
См. Также: Ковариация типа Box в Rust