tgoop.com/paniccode/16
Last Update:
Еще когда я даже не учил Rust, но спрашивал у знающих знакомых "как работает XXX", меня часто не удовлетворял ответ: казалось, что для того, чтобы писать такой же эффективный код на Rust
, как и на C++
, мне бы пришлось постоянно использовать unsafe
.
Возьмем Option/optional
:
Плюсы говорят "вот тип, вы можете проверять, лежит ли в нем что-то, а можете не проверять, так как уже проверяли когда-то до этого, нам пофиг. Но если не проверите, то будет бобо"
Раст говорит "вот тип, вы или должны проверить, или должны явно указать, что вы умнее через unsafe
"
И во времена, когда я был ярым C++сером, мне казалось, что это будет как в плюсах, только неудобнее, потому что я даже не подозревал, что можно лучше.
Простой пример, как в C++ проверить, что что-то лежит внутри optional
и получить значение:
if (optional_value != nullopt) {Если это в лоб переписать на Rust, получим:
auto value = *optional_value; // используем "небезопасную" штуку без проверки, но мы же молодцы, мы проверили
std::cout << value << std::endl;
}
if optional_value.is_some() {И когда я получал ответ на свой вопрос, мне казалось что как-то так оно и работает и люди реально пишут такой код
let value = unsafe { optional_value.unwrap_unchecked() };
println!("{}", value);
}
Но
Option
, и 100% у меня лежит там значение" <=> вы бы хотели вместо Option<T>
иметь тип T
. И вместо того, чтобы держать это все в голове/комментариях (как в случае C++), мы выражаем это в типах, и перекладываем ответственность следить за типами на компилятор:if let Some(value) = optional_value {В первую очередь мне нравится то, что это тупо короче и читаемее (имхо). Мы буквально написали "если в
// typeof(value) == T
println!("{}", value);
}
Option
лежит что-то, то дай значение, иначе пропусти ветку" в одну строчку.Но помимо этого, как я говорил, мы переложили ответственность следить за типами на компилятор. Поэтому, например, если кто-то удалит строчки с
if
(или переместит/скопирует тело if
), то первые два варианта нормально скомпилируются, но последний - нет (т.к. у вас просто нет переменной value
)Лично я называю это "писать код в стиле Rust". С одной стороны - по сути это просто синтаксический сахар, реальной разницы после компиляции (вроде бы) нет. Но с другой стороны, последний вариант читаемее и безопаснее. Иногда у меня возникает ощущение, что некоторые люди очень поверхностно изучают Rust и пытаются писать "как на плюсах", расстраиваются, и возвращаются обратно. Но если бы они приложили больше усилий, то вполне возможно, их мнение было бы совсем другим.
BY Panic! At the 0xC0D3
Share with your friend now:
tgoop.com/paniccode/16