время жизни должно быть действительным для статического времени жизни - PullRequest
0 голосов
/ 11 ноября 2019
trait X {}

trait Y {}

struct A {}

impl X for A {}

struct B<'r> {
    x: &'r mut Box<dyn X + 'r>,
    id: i32,
}

impl <'r> Y for B<'r> {}


struct Out {
    x: Box<dyn X>,
}

impl Out {
    pub fn new() -> Self {
        return Out {
            x: Box::new(A{})
        }
    }

    pub fn get_data(&mut self) -> Box<dyn Y> {
        return Box::new(B{
            id: 1,
            x: &mut self.x
        })
    }
}

Запустите его здесь на детской площадке.

Я получаю это примечание от компилятора:

note: but, the lifetime must be valid for the static lifetime...
   = note: ...so that the expression is assignable:
           expected &mut std::boxed::Box<dyn X>
              found &mut std::boxed::Box<(dyn X + 'static)>

Я понимаю, откуда исходит статическое время жизни, но это же время жизни не передается в структуру B во время ее создания, которая принимает любое общее время жизни.

[Изменить после ответа ниже]

Я также пытался сделать структуру Out Out универсальной, но потомневозможно использовать его после инициализации.

1 Ответ

0 голосов
/ 11 ноября 2019

Я это исправил ( детская площадка ). Вот соответствующий код:

// note the lifetime!
struct Out<'a> {
    x: Box<dyn X + 'a>,
}

// note the lifetime!
impl<'a> Out<'a> {
    pub fn new() -> Self {
        return Out {
            x: Box::new(A{})
        }
    }

    pub fn get_data(&'a mut self) -> Box<dyn Y + 'a> {
        return Box::new(B {
            id: 1,
            x: &mut self.x,
        })
    }
}

Почему это необходимо?

Объекты черты всегда имеют время жизни. Если время жизни не указано или не определено, по умолчанию используется значение 'static. Следовательно, вы должны сделать Out универсальным в течение срока его службы и использовать его в реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...