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

Вышел Rust 1.99.0! Бла-бла-бла, детали.

▪️В Rust добавили вариадики! ...Сишные. Раньше эти функции можно было декларировать, а теперь можно и определять:

/// SAFETY: must be called with (at least) 2 i32 arguments.
unsafe extern "C" fn sum(mut args: ...) -> i32 {
// SAFETY: guaranteed by the caller.
let a = unsafe { args.next_arg::<i32>() };
let b = unsafe { args.next_arg::<i32>() };
a + b
}

fn foo() -> i32 {
unsafe { sum(0i32, 2i32) }
}


Список типов, значения которых можно доставать через next_arg, ограничен sealed трейтом VaArgSafe. Связано это с тем, что в C значения некоторых типов при передаче в вариадическую функцию кастуются в более крупные типы, поэтому их по определению из VaList достать нельзя. Кстати, сам VaList, если сильно нужно, можно передавать явно и даже клонировать.

Также такие функции могут быть #[naked], и по очевидным причинам их нужно писать на ассемблере.

▪️Пачка линтов unused теперь включает в себя unreachable_cfg_select_predicates.

▪️Теперь гарантируется, что получить доступ к содержимому UnsafeCell<T> можно через каст сырого указателя в указатель на T, использовать UnsafeCell::get необязательно. Общие правила насчёт unsafe, соблюдающего правила языка, остаются в силе.

▪️RangeInclusive исторически плохо оптимизировался из-за того, что последняя итерация должна была обрабатываться отдельно. Это в какой-то мере исправили, добавив в трейт Step, на который опираются диапазоны, методы для итерации с возвратом флага переполнения.

▪️Если имя метода неправильное (несуществующее), но является именем из #[doc(alias)] на существующем методе, то этот метод будет предложен в первую очередь, выше имён со схожим написанием.

▪️Стабилизировали API, включая:
🔸IntoIterator на Box<[T; N]>, &Box<[T; N]> и &mut Box<[T; N]>.
🔸VecDeque::retain_back: выкинуть из деки все элементы, кроме указанного числа последних.
🔸Box::into_non_null и Box::from_non_null.
🔸Vec::into_parts и Vec::from_parts, где parts — это тройка из NonNull указателя на аллокацию, длины и ёмкости.
🔸core::mem::{size_of_val_raw, align_of_val_raw} и core::alloc::Layout::for_value_raw, аналогичные существующим функциям без *_raw, но работающие на сырых указателях. Разумеется, unsafe.
🔸std::fs::{set_times, set_times_nofollow} для установки временных отметок на файлах. На всех OS можно менять время доступа и модификации. Дополнительно на Windows и OS от Apple можно менять время создания. *_nofollow вариант при использовании на символической ссылке меняет атрибуты самой ссылки, а не файла, на который она указывает (довольно кривой дизайн, кмк: что, если потом нужно расширить набор флагов? Не делать же по функции на каждую комбинацию).

▪️В rustdoc добавили линт, предупреждающий о неиспользованных сносках в документации.
blog.rust-lang.org Announcing Rust 1.99.0 | Rust Blog Empowering everyone to build reliable and efficient software.
  • 👍 4
More from @dereference_pointer_there
  1. Oct 2, 2026Что, простите?
  2. Oct 1, 2026Кампейн Abomination vaults, в котором я участвовал и который продолжался больше года, сего…
  3. Oct 1, 2026https://t.me/AlexCarrier/16988 Ор выше гор 10000 подписчиков Это точно поможет продвижению…
  4. Oct 1, 2026photo post
  5. Sep 30, 2026маниакальный смех
  6. Sep 30, 2026#prog #rust #rustlib #article Deser: Rethinking Rust Serialization Статья про новую библио…
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 →