#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. Потому что нет причин для возникновения ошибки компиляции?