tgoop.com/dereference_pointer_there/9610
Last Update:
#prog #rust #rustreleasenotes
Вышла версия Rust 1.87.0! Как всегда, тут только выдержки, всё остальное — в полных заметках о релизе.
▪️Не фича, но: прошло ровно 10 лет с момента релиза Rust 1.0 🎉
▪️В качестве продолжения темы из предыдущего релиза очень много интринсиков из std::arch
теперь можно вызывать без unsafe-блоков в функциях, на которых есть #[target_feature]
, включающая набор инструкций с этими интринсиками.
▪️Точное указывание захватываемых обобщённых параметров (use<...>
) теперь работает и для impl Trait
в методах трейтов. К сожалению, опускать обобщённые типовые и const-овые параметры всё ещё нельзя.
▪️При написании impl-а трейта на dyn Trait
теперь необязательно реализовывать методы с Self: Sized, так как их всё равно нельзя вызвать.
▪️Однажды в компиляторе был баг, из-за которого dyn A + B
и dyn B + A
считались разными типами и, как следствие, для них можно было написать две разные реализации одного трейта. Баг поправили, но, так как это номинально слом обратной совместимости, оставили это предупреждением. С версии 1.87.0 это теперь ошибка компиляции.
▪️Унарные операторы теперь корректно парсятся при применении к диапазонам с открытой нижней границей. Как следствие, эта синтаксическая конструкция теперь корректно матчится с макро-фрагментом expr в декларативных макросах, что может привести к тому, что некоторые макросы теперь могут раскрываться иначе.
▪️В стандартную библиотеку добавили поддержку каналов (в смысле pipes). Из неприятного: так как это тонкая обёртка над примитивами OS, указать ёмкость этих каналов нельзя.
▪️Для примитивных чисел добавили методы unbounded_shl и unbounded_shr. Обычные битовые сдвиги сдвигают числа не на указанное число бит, а на число бит, равное остатку от деления указанного числа на битовую ширину. Это хорошо ложится на команды процессора, но это — крайне неполезная для программиста семантика. unbounded_*
методы лишены этой проблемы: при сдвиге на значение, большее битовой ширины, методы возвращают 0 для сдвига влево, 0 для сдвига вправо у беззнаковых чисел и размноженный знаковый бит для знаковых чисел (то есть 0 для положительных и -1 для отрицательных).
▪️У знаковых чисел добавили метод cast_unsigned, а у беззнаковых — cast_signed (включая NonZero
). Да, это полностью аналогично использованию кастов через as
, но эти методы позволяют убедиться, что битовая ширина не меняется.
▪️Ещё беззнаковым числам добавили метод is_multiple_of. Казалось бы, зачем?
This function is equivalent to self % rhs == 0, except that it will not panic for rhs == 0. Instead, 0.is_multiple_of(0) == true, and for any non-zero n, n.is_multiple_of(0) == false.
▪️Из несколько более значимого: стабилизировали
extract_if
для вектора и для связного списка. Оба итератора извлекают из коллекции элементы, соответствующие предикату, и оба позволяют модифицировать переданные элементы. Версия для вектора ещё и позволяет указать диапазон, на котором применяется фильтрация.▪️Также коллекцию методов
take_*
на слайсах для извлечения указанных частей (со странными на первый взгляд типами self
: &mut &{,mut}[T]
) стабилизировали с именами split_off_*▪️
OsStr{, ing}
теперь имеют методы display, которые возвращают реализующую Display
обёртку. По очевидным причинам обёртка может при выводе терять данные из-за невозможности представить некоторые элементы в UTF-8.▪️Целую пачку API стабилизировали для использования в const-контекстах. Наиболее значимым, пожалуй, является
<[T]>::copy_from_slice
.▪️Вывод
Debug
для сырых указателей теперь включает не только адрес, но и метаданные, при наличии.▪️Парочка изменений, связанных с fmt-макросами. Во-первых, в одной из версий из-за изменений внутреннего представления стало возможным использовать
format_args!
(в том числе не напрямую, а через panic!
) вида format_args!("{}", "a")
в const-контекстах. Эта было ненамеренно, поэтому в 1.87.0 эту возможность прикрыли. Во-вторых, значения для указания максимальной ширины форматирования и максимальной точности теперь ограничены 16 битами. Звучит смешно, но некоторые либы это сломало.BY Блог*
Share with your friend now:
tgoop.com/dereference_pointer_there/9610