Rust — это новый горячий язык (настолько новый, насколько может быть язык 2006 года), который может похвастаться надежностью и эффективностью.

Как оно работает? Что ж, у Rust есть то, чего нет ни в одном другом языке — он гарантирует безопасность памяти и потоков, сохраняя при этом такую ​​же высокую производительность, как у C или C++, и при этом обладает функциями высокого уровня, такими как сопоставление с образцом и функциональное программирование!

Некоторые языки приближаются к этому: Go известен своей скоростью работы и написания, но его сборщик мусора и ксенофобия по отношению к другим языкам добавляют накладные расходы, что означает, что он не подходит для языка системного программирования.

В безопасном Rust нет такого понятия, как неопределенное поведение. Все, что говорит ваш код, произойдет — ошибки сегментации и исключения NullPointerException невозможны.

Для более простых проблем компилятор rustc более или менее точно сообщает вам, что пошло не так, вместе с полезным кодом ошибки, ссылкой на примеры того, как исправить код ошибки, и даже предложением, которое относится непосредственно к вашему текущему коду, что более важно. раз, чем не сразу устраняет проблему.

error: format argument must be a string literal
--> helloworld.rs:3:14
  |
3 | println!(123);
  | ^^^
  |
help: you might be missing a string literal to format with
  |
3 | println!("{}", 123);
  |
error[E0384]: cannot assign twice to immutable variable `a`
 --> helloworld.rs:3:5
  |
2 |     let a = 123;
  |         -
  |         |
  |         first assignment to `a`
  |         help: consider making this binding mutable: `mut a`
3 |     a *= 2;
  |     ^^^^^^ cannot assign twice to immutable variable

Спасибо, rustc!

Со временем вы перестанете меньше думать о границах языка и больше сосредоточитесь на реализации того, что хотите реализовать. Rust делает так, что вам не нужно каждую минуту останавливаться и задавать себе эти вопросы:

  • Что, если эта переменная не инициализирована или не определена?
  • Что делать, если эта переменная уже используется?
  • Что, если я изменяю переменную, которая не должна изменяться?
  • Что, если другой поток изменит эти данные, пока я их читаю?
  • Я забыл обработать ошибку?
  • Я забыл проверить ошибку?

Так как же это сделать?

Неизменяемость по умолчанию

Ведутся споры о том, что лучше неизменяемые или изменяемые объекты. Ну, Rust предоставляет и то, и другое, но вы должны явно указать Rust, что вы хотите, чтобы ваши переменные были изменяемыми. Например, второе сообщение об ошибке в этой статье показывает, что вам нужно ключевое слово mut, чтобы позволить компилятору изменять значения переменных.

let mut a = 1;

Это касается всего: от ссылок до аргументов функций. Если переменная не передается как mut, она не может быть изменена, и вы ничего не можете сделать, чтобы обойти это. Это также не похоже на const в JavaScript — внутренние переменные структуры также должны быть объявлены изменяемыми, чтобы перезаписать их.

Это дополнительное трение к изменчивости означает, что разработчики, как правило, предпочитают неизменяемые объекты, когда это возможно, поэтому очень ясно, когда переменная может измениться!

Проверка заимствования

Возможно, флагманская функция Rust, это то, как Rust управляет памятью без сложности ручного управления памятью или накладных расходов на сборщик мусора. Короче говоря, у каждой переменной есть владелец, и у них может быть только один владелец.

Вы можете «одолжить» значение, если хотите что-то с ним сделать, но вернуть его для использования позже, но типичных ловушек указателей в Rust не существует, потому что в Rust нет указателей! (По крайней мере, не безопасный Rust.)

Вот пример того, что предотвращает Rust: если вы оперируете вектором B, он изменит C, поэтому гарантии безопасности Rust не будут выполняться. Вот почему компилятор не позволяет вам запускать это в первую очередь.

let a = vec![1, 2, 3];
let b = a;
let c = a;

2 |     let a = vec![1, 2, 3];
  |         - move occurs because `a` has type `Vec<i32>`, which does not implement the `Copy` trait
3 |     let b = a;
  |             - value moved here
4 |     let c = a;
  |             ^ value used here after move

И именно здесь вы действительно должны оценить, сколько информации дает вам компилятор. Это:

  • сообщает вам, откуда произошло значение
  • сообщает вам, где использовалось значение
  • и сообщает вам, где значение использовалось снова, что не разрешено

Заключение

Несмотря на то, что существует довольно крутая кривая обучения от того, как много нужно забыть о финских вещах, которые вы можете делать в более традиционных языках, Rust — это язык, который позволяет компьютеру вычислять, верна ли ваша программа, позволяя вам думать исключительно о том, как решить ваши проблемы.