В ржавчине тип переменной обычно выводится из контекста.
Контекст может включать в себя любое из следующего:
- Тип присваиваемого значения:
let x = String::new(); //x is now a String
- Тип возвращаемого значения вызываемой функции:
fn foo() -> usize {
40
}
let x = foo(); //x is now usize
Но если у вас нет типа для вывода, то, как нетприсвоение переменной:
let x;
Тогда ржавчина не может определить тип.Следовательно, это разозлится на вас .
Еще одна проблема, которую необходимо решить в этом ответе;тот факт, что ржавчина не позволяет читать неинициализированные переменные.Следующее значение x
неинициализировано:
let x: u32;
Считывание значения неинициализированного u32
, вероятно, не слишком много, но примите во внимание следующее:
struct MyString {
ptr: *const u8,
len: usize,
cap: usize,
}
Если бы мы предоставили безопасную оболочку для этого, это было бы прекрасно, в конце концов, это то, к чему сводится stdlib String
.Но если бы мы владели неинициализированным MyString
и попытались прочитать его содержимое, мы бы закончили чтение адреса мусора из ptr
и мусора len
и cap
.Это привело бы к чтению указателя мусора, который является неопределенным поведением, что является приоритетом ржавчины №1 для устранения.
Итак, резюмируем:
✓ Каждая переменная должна иметь тип, определяемый во время выполнения (включая стертые типы, потому что это тоже конкретные типы [dyn Trait
и impl Trait
], но impl Trait
особенное.)
✓ Каждой переменной должно быть присвоено какое-то значение, прежде чем вы сможете прочитать ее значение.
✓ Rust очень старается устранить all undefined поведению.