Выбрать главу

Компилятор будет выводить подробные сообщения об ошибках, связанных с изменяемостью.

Связывание переменных имеет локальную область видимости, и живут эти переменные в блоке. Блок — набор инструкций, заключённый между фигурными скобками {}. Кроме того, допускается затенение переменных.

fn main() {

// Эта переменная живёт в функции main

let long_lived_binding = 1;

// Это блок, он имеет меньшую область видимости, чем функция main

{

// Эта переменная существует только в этом блоке

let short_lived_binding = 2;

println!("inner short: {}", short_lived_binding);

// Эта переменная *затеняет* собой внешнюю

let long_lived_binding = 5_f32;

println!("inner long: {}", long_lived_binding);

}

// Конец блока

// Ошибка! `short_lived_binding` нет в этой области видимости

println!("outer short: {}", short_lived_binding);

// ИСПРАВЬТЕ ^ Закомментируйте строку

println!("outer long: {}", long_lived_binding);

// Это связывание так же *скрывает* собой предыдущие

let long_lived_binding = 'a';

println!("outer long: {}", long_lived_binding);

}

הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Можно сначала объявить связь с переменной, а инициализировать её позже. Однако, такая форма используется редко, так как может привести к использованию неинициализированных переменных.

fn main() {

// Объявляем связь с переменной

let a_binding;

{

let x = 2;

// Инициализируем связь

a_binding = x * x;

}

println!("связь а: {}", a_binding);

let another_binding;

// Ошибка! Использование неинициализированной связи с переменной

println!("другая связь: {}", another_binding);

// ИСПРАВЬТЕ ^ Закомментируйте строку

another_binding = 1;

println!("другая связь: {}", another_binding);

}

הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Компилятор запрещает использование неинициализированных переменных, так как это привело бы к неопределённому поведению.

Rust предоставляет несколько механизмов изменения или определения примитивных и пользовательских типов:

   • Приведение между примитивными типами

   • Указание желаемого типа при помощи литералов

   • Использование вывода типов

   • Псевдонимы типов

Rust не предусматривает неявного преобразования типов (принудительное) между примитивными типами. Но, явное преобразование типов (casting) можно выполнить используя ключевое слово as.

Правила, используемые для преобразование внутренних типов, такие же, как в языке C, за исключением тех случаев, когда преобразование типов в языке C вызывает неопределённое поведение. Поведение всех приведений между встроенными типами чётко определено в Rust.

// Убрать все предупреждения

// которые вызываются переполнением при преобразование типов.

#![allow(overflowing_literals)]

fn main() {

let decimal = 65.4321_f32;

// Ошибка! Нет неявного преобразования

let integer: u8 = decimal;

// ИСПРАВЬТЕ ^ Закомментируйте данную строку

// Явное преобразование

let integer = decimal as u8;

let character = integer as char;

// Ошибка! Здесь ограничение в правилах конвертации. Число с плавающей точкой не может быть напрямую конвертирован в символ.