Rust 1.96.0: новый стабильный релиз с улучшениями компилятора и стандартной библиотеки
Я обновляю Rust каждые шесть недель. Это как чистка зубов - не замечаешь процесса, но потом удивляешься, почему раньше терпел.
Вышел 1.96.0.
Никаких новых фич. Никакого синтаксиса. Ничего, что можно было бы показать на демо-стенде.
И именно поэтому я обрадовался.
Когда я только начинал работать с Rust, я ждал больших релизов. Новая версия, новый синтаксис, новая возможность.
Сейчас я жду стабилизаций.
Потому что в больших проектах - а я работаю с кодовыми базами под сотню тысяч строк - важнее всего предсказуемость. Когда компилятор ведёт себя одинаково, когда ты можешь доверять выводу типов, когда диагностика говорит правду.
Rust 1.96.0 - именно такой релиз.
Type inference теперь не врёт (почти)
У меня есть проект, где цепочка вызовов может быть длиной в 5–6 функций. Раньше, когда компилятор выдавал ошибку, я часто получал рекомендацию, которая не указывала на реальную проблему. Ошибка выводилась не из источника, а из промежуточного состояния вывода типов.
Ты смотришь на диагност, видишь совет, следуешь ему, а проблема не исчезает. Потому что первопричина - на два шага раньше.
В 1.96.0 это исправили.
Теперь ошибка показывает, где реальный конфликт типов, а не его симптом. Я проверил на старом проекте. Там было три места, где диагностика раньше сбивала с толку. Два из них исчезли. Третье - стало понятнее.
Это мелочь. Но когда ты сидишь вечером с сотней ошибок после слияния веток - мелочи имеют значение.
Never-type и туплы: редкий баг, который мы нашли случайно
В моей команде был случай. Кто-то переписал обработчик ошибок, использовал panic! в ветвлении, а компилятор начал выдавать странное поведение при выводе типов в tuple expression. Мы потратили час на то, чтобы понять, что происходит.
В 1.96.0 это исправили.
Never-type ! теперь корректно работает в контексте tuple-выражений. Я не буду углубляться в детали - скажу только, что это устраняет редкую несогласованность, которая могла выстрелить в самый неожиданный момент.
Диапазоны перестали быть загадкой
Наиболее значимое изменение в стандартной библиотеке.
Range, RangeFrom и RangeInclusive теперь ведут себя согласованно с IntoIterator. Раньше диапазоны могли демонстрировать разное поведение в зависимости от контекста: где-то они вели себя как copy-типы, где-то - как итераторы.
Это раздражало. Особенно когда ты писал обобщённый код, работающий с разными типами диапазонов.
Теперь это унифицировано. Диапазоны предсказуемы как value-type конструкция.
Я проверил на своих проектах. В одном месте раньше нужно было явно преобразовывать RangeInclusive в итератор. Теперь можно убрать обёртку. Код стал чище на три строчки.
Не много. Но приятно.
assert_matches! научили говорить
До 1.96.0, когда assert_matches! падал, ты получал строковое описание значения, которое не совпало с паттерном.
Теперь - структурированное представление.
Я работаю с проектом, где активно используются enum-машины состояний. Там плотность паттернов высокая. Раньше, чтобы понять, почему тест упал, приходилось вручную разбирать вывод. Сейчас диагностика сама показывает, в чём расхождение.
Экономит 10–15 минут в неделю. За год - это несколько дней.
Cargo закрывает дыры в цепочке поставок
В корпоративных проектах мы используем приватные registry. Там свои репозитории, свои прокси, свои схемы.
Раньше Cargo мог неконсистентно интерпретировать источники пакетов в приватных окружениях. Это создавало риск: потенциальная атака через нестандартный URL или архив.
В 1.96.0 это закрыли.
Нормализация URL и обработка архивов теперь строже. crates.io не затронуто, а вот для приватных registry изменения заметны.
Наш DevOps на днях сказал: «Ну наконец-то».
WASM перестал молчать
Раньше, когда компилятор встречал undefined symbols в WASM-таргете, он мог интерпретировать их как неявные импорты из env namespace.
Ты компилируешь, загружаешь в браузер, и только там, в рантайме, обнаруживаешь, что чего-то не хватает.
Теперь такие случаи - явная ошибка линковки. На этапе компиляции. До того, как ты запустил сборку.
Это строже. Но это честнее.
Архитектуры: RISC-V, LoongArch, s390x
Я не работаю с этими платформами. Но меня радует, что Rust продолжает их поддерживать.
Inline assembly для s390x уточнён. Профили для RISC-V и LoongArch обновлены.
Для большинства разработчиков это незаметно. Но для тех, кто пишет системный код под альтернативные архитектуры, это важно.
Что я понял про этот релиз
Rust 1.96.0 не добавляет фич. Он исправляет поведение.
Type inference стал точнее. Диапазоны - предсказуемее. Cargo - надёжнее. WASM - строже.
Ни одно из этих изменений не видно на демо. Но они проявляются в том, что компилятор перестаёт врать, сборка перестаёт давать сюрпризы, а production-системы - перестают падать в неожиданных местах.
Я веду один проект уже три года. За это время мы обновляли Rust десятки раз. И я заметил, что лучшие релизы - не те, где появилось что-то новое.
А те, где перестало болеть то, что уже было.
Rust 1.96.0 - именно такой.
Я не знаю, когда выйдет следующая большая фича.
Но я знаю, что сегодня мой компилятор стал чуть честнее. Диагностика - чуть понятнее. И это, наверное, важнее, чем новая синтаксическая конструкция.
Потому что предсказуемость - это то, ради чего я выбрал Rust.
Комментарии
Чтобы оставить комментарий, войдите в аккаунт.