Для сохранения совместимости разработчики могут использовать в своих программах метки «2015», «2018», «2021» и «2024», позволяющие привязать программы к срезам состояния языка, соответствующим выбранным редакциям Rust. Редакции были введены для разделения несовместимых изменений и настраиваются в метаданных cargo-пакетов через поле «edition» в секции «[package]».
Например, редакция «2021» включает стабилизированную на конец 2021 года функциональность и охватывает все дальнейшие изменения, не нарушающие совместимость. Редакция «2024» дополнительно включает нарушающие совместимость новшества, предложенные в текущем выпуске 1.85 и утверждённые для реализации в будущем. Кроме самого языка редакции также учитывают состояние инструментария и документации.
Для автоматической адаптации кода к новой редакции языка может использоваться команда «cargo fix».
Основные несовместимости, зафиксированные в Rust 2024:
- Изменено поведение при захвате параметров в «impl Trait», если не используется новый синтаксис «use‹..›», определяющий информацию о скрытых типах. В Rust 2024 если «use‹..›» не используется все параметры в области видимости неявно захватываются. Если необходимо ограничить захват параметров, следует использовать «use‹..›», например, «impl Trait + use» указывает, что в скрытом типе разрешено использовать только параметры «x» и «T».
- В выражениях «if let» изменена область видимости временных значений, полученных в результате выполнения выражения.
При выполнении «if let $pat = $expr { .. } else { .. }» временные значения, полученные в блоке $expr, теперь будут удалены до переключения на блок «else», а не после обработки «else { .. }». - Изменена область видимости временных значениях в хвостовых выражениях, завершающих выполнение функции, блока или замыкания. Подобные значения теперь сбрасываются до локальных переменных (раньше они могли сохраняться дольше, чем сам блок и определённые в нём локальные переменные).
- Запрещены некоторые неоднозначно трактуемые разработчиками варианты применения mut, ref, ref mut, & и &mut в шаблонах, например, вместо «let [x, mut y] = &[(), ()];» следует писать «let &[ref x, mut y] = &[(), ()];».
- Блоки «extern» обязательно должны помечаться ключевым словом «unsafe».
- Атрибуты export_name, link_section и no_mangle должны помечаться ключевым словом «unsafe».
- Включено по молчанию предупреждение «unsafe_op_in_unsafe_fn» для проверки обрамления блоками «unsafe {}» кода, используемого в unsafe-функциях.
- Запрещено выставлять ссылки на элементы, определённые как «static mut».
- Lint-проверка «never_type_fallback_flowing_into_unsafe» по умолчанию переключена в режим «deny».
- В спецификатор «expr» добавлена поддержка выражений «const» и «_».
- Lint-проверка «missing_fragment_specifier» переведена в режим вывода ошибки.
- Зарезервировано ключевое слово «gen», которое в будущем планируют использовать для генераторов.
- Зарезервирован стиль определения строк ‘#»foo»#’ и токены ‘##’.
- В стандартной библиотеке в число автоматически импортируемых типажей добавлены Future и IntoFuture. В структуру «Box‹[T]›»добавлен типаж IntoIterator. Помечены ключевым словом unsafe функции std::env::set_var, std::env::remove_var и std::os::unix::process::CommandExt::before_exec.
- В пакетном менеджере Cargo включён по умолчанию новый механизм обработки зависимостей, выбирающий версии зависимых компонентов с учётом совместимости с версиями компилятора Rust, заявленными как минимально поддерживаемые проектом (MSRV, Minimum Supported Rust Version). Удалены некоторые устаревшие ключи в Cargo.toml. В зависимости
запрещено использование режима «default-features = false», если она унаследована от пакета со значением «default-features = true» или без параметра «default-features». - В Rustdoc тесты doctest объединены в один исполняемый файл.
При включении doctest через «include_str!» файловый путь теперь вычисляется относительно Markdown-файла, а не файла с кодом. - В Rustfmt предложена концепция редакций стиля форматирования. Изменена логика сортировки идентификаторов.
Новшества Rust 1.85:
- Добавлена поддержка асинхронно выполняемых замыканий, определяемых в форме «async || {}» и работающих по аналогии с асинхронным вызовом функций (async fn).
- Добавлен атрибут «#[diagnostic::do_not_recommend]», при котором компилятор не будет показывать аннотированные реализации типажей в диагностических сообщениях.
- Предоставлена возможность использования типажей FromIterator и Extend с кортежами, содержащими до 12 элементов — начиная с «(T,)» и заканчивая «(T1, T2, .., T11, T12)».
- В разряд стабильных переведена новая порция API, в том числе стабилизированы методы и реализации типажей:
- Признак «const» применён в функциях:
mem::size_of_val
mem::align_of_val
Layout::for_value
Layout::align_to
Layout::pad_to_align
Layout::extend
Layout::array
std::mem::swap
std::ptr::swap
NonNull::new
HashMap::with_hasher
HashSet::with_hasher
BuildHasherDefault::new
‹float›::recip
‹float›::to_degrees
‹float›::to_radians
‹float›::max
‹float›::min
‹float›::clamp
‹float›::abs
‹float›::signum
‹float›::copysign
MaybeUninit::write
- Реализован второй уровень поддержки платформы powerpc64le-unknown-linux-musl. Второй уровень поддержки подразумевает гарантию сборки.
Язык Rust сфокусирован на безопасной работе с памятью и предоставляет средства для достижения высокого параллелизма выполнения заданий, при этом обходясь без использования сборщика мусора и runtime (runtime сводится к базовой инициализации и сопровождению стандартной библиотеки). Методы работы с памятью в Rust избавляют разработчика от ошибок при манипулировании указателями и защищают от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п.
Безопасная работа с памятью обеспечивается в Rust во время компиляции через проверку ссылок, отслеживание владения объектами, учёт времени жизни объектов (области видимости) и оценку корректности доступа к памяти во время выполнения кода. Rust также предоставляет средства для защиты от целочисленных переполнений, требует обязательной инициализации значений переменных перед использованием, лучше обрабатывает ошибки в стандартной библиотеке, применяет концепцию неизменяемости (immutable) ссылок и переменных по умолчанию, предлагает сильную статическую типизацию для минимизации логических ошибок.
Источник: http://www.opennet.ru/opennews/art.shtml?num=62769