Все значения в Rust должны иметь инициализированное значение для безопасного доступа.
Это потому, что операции с использованием неинициализированных значений имеют неопределенное поведение. Это может привести к тому, что компилятор случайно неверно скомпилирует ваш код.
Предотвращение неправильной компиляции является одной из главных целей Rust; включая другие формы неопределенного поведения, такие как гонки данных, разыменование недопустимого указателя или изменение данных, которые другой код предполагает не изменять. Подробнее здесь .
В C вы можете получить доступ к этим значениям; тем самым позволяя компилятору неправильно компилировать ваш код, поскольку вы нарушили контракт. Однако в Rust вам не разрешено это делать.
В некоторых языках, таких как C#, неинициализированные значения заменяются на null
. У нас похожая концепция: Option
s, которые либо Some(value)
, либо есть None
.
Обратите внимание, что если компилятор неправильно компилирует ваш код из-за неопределенного поведения, связанного с некорректными операциями, то это не ошибка компилятора. Это также не пытается искать это; он просто пытается оптимизировать ваш код. Если бы я дал вам бейсбольную биту, а вы использовали ее, чтобы ударить по голове, то вы бы ее неправильно использовали, как дизайнер, это не моя вина, поскольку я не мог предвидеть, что вы ее неправильно используете.
Там есть способов сделать то, что вы можете сделать в C. Это unsafe
и настоятельно не рекомендуется для обычных операций, поэтому, пожалуйста, постарайтесь найти другое решение, прежде чем переходить к ненужному unsafe
и, возможно, к неправильному поведению.
Используйте std::mem::MaybeUninit
и , прочитайте Romic nomicon , прежде чем копаться в unsafe
.