что по сути означает «я знаю, что я делаю, поверь мне», компилятор верит, что ты знаешь, что делаешь. Эти проверки затем отключаются на время блока.
у я могу иметь несколько изменяемых ссылок на статический тип в одной и той же области?
static mut CURSOR: Option<B> = None;
struct B {
pub field: u16,
}
impl B {
pub fn new(value: u16) -> B {
B { field: value }
}
}
struct A;
impl A {
pub fn get_b(&mut self) -> &'static mut B {
unsafe {
match CURSOR {
Some(ref mut cursor) => cursor,
None => {
CURSOR= Some(B::new(10));
self.get_b()
}
}
}
}
}
fn main() {
// first creation of A, get a mutable reference to b and change its field.
let mut a = A {};
let mut b = a.get_b();
b.field = 15;
println!("{}", b.field);
// second creation of A, a the mutable reference to b and change its field.
let mut a_1 = A {};
let mut b_1 = a_1.get_b();
b_1.field = 16;
println!("{}", b_1.field);
// Third creation of A, get a mutable reference to b and change its field.
let mut a_2 = A {};
let b_2 = a_2.get_b();
b_2.field = 17;
println!("{}", b_1.field);
// now I can change them all
b.field = 1;
b_1.field = 2;
b_2.field = 3;
}
Я знаю озаимствование правила
одна или несколько ссылок (&T
) к ресурсу,ровно одна изменяемая ссылка (&mut T
).В приведенном выше коде у меня есть структураA
сget_b()
метод возврата изменяемой ссылки наB
, С этой ссылкой я могу изменить поля структурыB
.
Странно то, что в одной области видимости может быть создано более одной изменяемой ссылки (b, b_1, b_2
) и я могу использовать их все для измененияB
.
Почему я могу иметь несколько изменяемых ссылок с'static
время жизни показано вmain()
?
Моя попытка объяснить это - поведение, потому что я возвращаю изменяемую ссылку с'static
продолжительность жизни. Каждый раз звонюget_b()
он возвращает ту же изменяемую ссылку. И в конце концов, это всего лишь одна идентичная ссылка. Это правильная мысль? Почему я могу использовать все изменяемые ссылки, полученные отget_b()
в индивидуальном порядке?