TGViewer
Блог* Блог* @dereference_pointer_there · 1.98K subscribers
Post #10964 1.13K
#prog #rust #rustreleasenotes

Вышла версия Rust 1.95.0! Как всегда, тут только выдержки, всё остальное в детальных заметках о релизе.

▪️if-гуарды на ветках match теперь могут использовать if let:

match value {
Some(x) if let Ok(y) = compute(x) => {
// Both `x` and `y` are available here
println!("{}, {}", x, y);
}
_ => {}
}


▪️Частично примыкающее изменение: компилятор больше не выдаёт предупреждение на безусловные паттерны в if let. Автор изменения мотивирует это распространением кода навроде такого:

fn main() {
if let x = funx() && x < usize::MAX {
// use x
}
}


Эта идиома позволяет привязать значение и что-то сделать/проверить с ним и при этом не пустить имя в окружающую область видимости.

▪️Добавили новый макрос cfg_select!, который позволяет сделать подобие match, но для cfg-предикатов:

cfg_select! {
unix => {
fn foo() { /* unix specific functionality */ }
}
target_pointer_width = "32" => {
fn foo() { /* non-unix, 32-bit functionality */ }
}
_ => {
fn foo() { /* fallback implementation */ }
}
}

let is_windows_str = cfg_select! {
windows => "windows",
_ => "not windows",
};


Технически этот макрос не даёт новых возможностей, но без него нужные атрибуты #[cfg] нужно выписывать самостоятельно, дублируя дословно все предикаты. Ровно по этой причине стал распространён и используется cfg-if — собственно, объявление в блоге напрямую на него и ссылается.

▪️Навряд ли кого-то коснётся, но: match по enum теперь всегда ведёт себя так, как будто он читает дискриминант. Это кажется странным, но объясняется #[non_exhaustive]. Без этого изменения то, есть ли в некотором unsafe-коде UB или нет, зависело от того, определён ли enum в текущем крейте или в другом. Также match теперь читает дискриминант, даже если только одна ветка населена — без этого изменения поведение различалось в обобщённом коде и в ручной мономорфизации.

▪️Поддержку части платформ подняли до Tier 2 — в основном встраиваемые ARM-платформы от Apple (и их симуляторные версии).

▪️Стабилизированы несколько API, в частности:

🔸Конверсии по ссылке из MaybeUninit-массивов в массивы и слайсы из MaybeUninit, а также конверсии по значению между ними
🔸Аналогичные конверсии по ссылке между массивами в Cell и массивами из Cell
🔸Модуль core::range, в котором собираются диапазоны, планируемые на замену текущим. Пока что стабилизированы только RangeInclusive и его итератор. В отличие от текущих диапазонов, новый тип не служит одновременно итератором и потому реализует Copy (при Copy-индексах, разумеется) и занимает меньше места: ему не нужно хранить состояние для отслеживания поведения на последней итерации, только два индекса.
🔸Функция core::hint::cold_path для пометки пути исполнения, который не предполагается, что будет часто исполняться. Этакая замена likely/unlikely.

▪️rustdoc теперь предпочитает стабильные определения нестабильным при сортировке результатов поиска.
  • 🎉 9
  • ❤ 2
  • 🔥 1
  • 🥰 1
More from @dereference_pointer_there
  1. Oct 6, 2026Post #11556
  2. Oct 5, 2026photo post
  3. Oct 5, 2026https://ayles.github.io/doom-in-kernel/ Коллеги (на этот раз действительно коллеги!) подог…
  4. Oct 5, 2026#cpp
  5. Oct 4, 2026#math #meme
  6. Oct 3, 2026Re: I spent $220 on Google app ads and 60% of the installs were robots My favorite story:…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →