Стабилизированы map и try_map для смарт-указателей

01.09.2026

Методы преобразования содержимого смарт-указателя получили стабильный статус. Раньше ими можно было пользоваться только в ночных сборках.

Что они делают

Метод берёт значение из смарт-указателя, применяет к нему преобразование и возвращает новый смарт-указатель. Преобразование получает ссылку на само значение — то есть может его осмотреть и решить.

Вариант с проверкой ошибки дополнительно позволяет отказаться от преобразования, вернув ошибку, — без паники. Если текущая реализация смарт-указателя не может быть разобрана обратно, отказ возможен не всегда.

Подготовка заняла три запроса

Методы требовали обобщения по аллокатору, иначе они не работали бы со смарт-указателями, выбирающими память самостоятельно. Это заняло отдельные запросы для основных типов и для уникальных вариантов с подсчётом ссылок.

Отдельно исправлена ошибка звучащести: при освобождении старого значения вызывалось освобождение даже для типа без размера. Для встроенного аллокатора это прощало, для произвольного — нет. Такие ошибки проявляются как повреждение памяти в сторонних аллокаторах и на стандартных сборках не видны.

Где это полезно

Смена типа содержимого на месте без лишнего выделения. Например, когда смарт-указатель содержал набор строк, а понадобился набор байтов, или когда нужно заменить значение, различающееся по размеру или выравниванию.

Особенно полезно там, где размер содержимого известен только в рантайме: преобразование на месте обходится без вычисления размера заранее.

Оригинал

stabilize smart pointer map functions; см. также rust-lang/rust#161617, #161893, #162285

Упоминаний: 1 · Просмотров: 4