Стабилизированы map и try_map для смарт-указателей
01.09.2026Методы преобразования содержимого смарт-указателя получили стабильный статус. Раньше ими можно было пользоваться только в ночных сборках.
Что они делают
Метод берёт значение из смарт-указателя, применяет к нему преобразование и возвращает новый смарт-указатель. Преобразование получает ссылку на само значение — то есть может его осмотреть и решить.
Вариант с проверкой ошибки дополнительно позволяет отказаться от преобразования, вернув ошибку, — без паники. Если текущая реализация смарт-указателя не может быть разобрана обратно, отказ возможен не всегда.
Подготовка заняла три запроса
Методы требовали обобщения по аллокатору, иначе они не работали бы со смарт-указателями, выбирающими память самостоятельно. Это заняло отдельные запросы для основных типов и для уникальных вариантов с подсчётом ссылок.
Отдельно исправлена ошибка звучащести: при освобождении старого значения вызывалось освобождение даже для типа без размера. Для встроенного аллокатора это прощало, для произвольного — нет. Такие ошибки проявляются как повреждение памяти в сторонних аллокаторах и на стандартных сборках не видны.
Где это полезно
Смена типа содержимого на месте без лишнего выделения. Например, когда смарт-указатель содержал набор строк, а понадобился набор байтов, или когда нужно заменить значение, различающееся по размеру или выравниванию.
Особенно полезно там, где размер содержимого известен только в рантайме: преобразование на месте обходится без вычисления размера заранее.
Оригинал
stabilize smart pointer map functions; см. также rust-lang/rust#161617, #161893, #162285
Упоминаний: 1 · Просмотров: 4