Строка `let mut x = 555;` делает коротко следующее: создаёт изменяемое связывание `x` (по типу выводится `i32`) со значением `555`; это полностью безопасная (safe) операция — `unsafe` не требуется. Ключевые моменты и пример использования с `unsafe` (когда нужно): - `let mut x = 555;` хранится на стеке и даёт возможность изменять `x`. - Заём (`&x`) и изменяемый заём (`&mut x`) подчиняются правилам заимствований (нет одновременных `&` и `&mut`). - Чтобы обойти проверяющий заимствования компилятор, можно взять «сырые» указатели и затем разыменовать их внутри `unsafe`. Пример: ``` let mut x = 555; let r1 = &x as *const i32; // создание сырого указателя (без unsafe) let r2 = &mut x as *mut i32; // тоже безопасно unsafe { // разыменование сырого указателя — требует unsafe *r2 = 101010; println!("{}", *r1); } ``` Примечания: - Создание сырых указателей само по себе не Unsafe; разыменование либо операция, нарушающая правила заимствований/инициализации, может привести к неопределённому поведению. - Для простого `let mut x = 555;` `unsafe` никогда не нужен.
Ключевые моменты и пример использования с `unsafe` (когда нужно):
- `let mut x = 555;` хранится на стеке и даёт возможность изменять `x`.
- Заём (`&x`) и изменяемый заём (`&mut x`) подчиняются правилам заимствований (нет одновременных `&` и `&mut`).
- Чтобы обойти проверяющий заимствования компилятор, можно взять «сырые» указатели и затем разыменовать их внутри `unsafe`.
Пример:
```
let mut x = 555;
let r1 = &x as *const i32; // создание сырого указателя (без unsafe)
let r2 = &mut x as *mut i32; // тоже безопасно
unsafe {
// разыменование сырого указателя — требует unsafe
*r2 = 101010;
println!("{}", *r1);
}
```
Примечания:
- Создание сырых указателей само по себе не Unsafe; разыменование либо операция, нарушающая правила заимствований/инициализации, может привести к неопределённому поведению.
- Для простого `let mut x = 555;` `unsafe` никогда не нужен.