Для сохранения совместимости разработчики могут использовать в своих программах метки "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, в том числе стабилизированы методы и реализации типажей:
- BuildHasherDefault::new
- ptr::fn_addr_eq
- io::ErrorKind::QuotaExceeded
- io::ErrorKind::CrossesDevices
- {float}::midpoint
- Unsigned {integer}::midpoint
- NonZeroU*::midpoint
- impl std::iter::Extend
- FromIterator‹(A, ...)›
- [url=https://doc.rust-lang.org/stable/std/task/struct.Waker.html#method.noop]std::task::Waker::noop
- Признак "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 во время компиляции через проверку ссылок, отслеживание владения объектами, учёт времени жизни объектов (области видимости) и оценку корректности доступа к памяти во время выполнения кода. Rust также предоставляет средства для защиты от целочисленных переполнений, требует обязательной инициализации значений переменных перед использованием, лучше обрабатывает ошибки в стандартной библиотеке, применяет концепцию неизменяемости (immutable) ссылок и переменных по умолчанию, предлагает сильную статическую типизацию для минимизации логических ошибок.
Источник: https://www.opennet.ru/opennews/art.shtml?num=62769
(opennet.ru, основная лента)