проблема времени жизни rust, почему при первом вызове не происходит ошибка компиляции?

#rust

#Ржавчина

Вопрос:

 #[derive(Debug)]
struct NumRef<'a>(amp;'a i32);

impl<'a> NumRef<'a> {
    // my struct is generic over 'a so that means I need to annotate
    // my self parameters with 'a too, right? (answer: no, not right)
    fn some_method(amp;'a mut self) {}
}

fn main() {
    let mut num_ref = NumRef(amp;5);
    num_ref.some_method(); // mutably borrows num_ref for the rest of its lifetime
    num_ref.some_method(); // compile error
    println!("{:?}", num_ref); // also compile error
}
  

‘a должно быть ‘static, время жизни num_ref короче, чем ‘static

Комментарии:

1. привет @bilosikia, что ты имеешь в виду с answer: no, not right ? Если это неправильно, почему вы все еще вставляете его с аннотацией времени жизни?

2. я думаю, что первый вызов должен скомпилировать ошибку, но факт не

3. Нет причин для того, чтобы первый вызов был ошибкой компилятора.

Ответ №1:

Проблема в том, что вы сказали Rust, что some_method нужно self для 'a .

Но по определению 'a живет дольше, чем экземпляр NumRef .

Это означает, что единственный способ выполнить ваше требование — создать заимствование, которое длится в течение всего срока службы экземпляра, иначе как только метод вызывается, вы полностью заблокированы.

Вы можете просто удалить привязку времени жизни из self полностью:

 impl<'a> NumRef<'a> {
    fn some_method(amp;mut self) {}
}
  

Эти времена жизни по существу не связаны: here some_method заботится о NumRef , нет 'a .

Комментарии:

1. ‘экземпляр живет дольше, но почему не сбой компиляции?

2. Потому что нет причин для возникновения ошибки компиляции?