РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
559 of 1245 menu

Трейт AsMut

Трейт AsMut предоставляет метод as_mut, который преобразует изменяемую ссылку &mut T в изменяемую ссылку &mut U. Параметром метод не принимает ничего - он вызывается на самой изменяемой ссыпке и возвращает новую изменяемую ссылку на другой тип. Этот трейт обычно реализуют для типов-обёрток, чтобы дать доступ к внутреннему значению без перемещения владения.

Синтаксис

trait AsMut<T: ?Sized> { fn as_mut(&mut self) -> &mut T; }

Пример

Давайте создадим обёртку над числом и получим изменяемую ссылку на внутреннее значение через as_mut:

struct Wrapper { value: i32, } impl AsMut<i32> for Wrapper { fn as_mut(&mut self) -> &mut i32 { &mut self.value } } fn main() { let mut w = Wrapper { value: 10 }; let inner = w.as_mut(); *inner = 20; println!("{}", w.value); }

Результат выполнения кода:

20

Пример

Давайте используем AsMut в функции, которая принимает любую изменяемую ссылку, приводимую к &mut i32:

use std::borrow::BorrowMut; fn increment<T: AsMut<i32>>(mut wrapper: T) { let value = wrapper.as_mut(); *value += 1; } struct Counter { count: i32, } impl AsMut<i32> for Counter { fn as_mut(&mut self) -> &mut i32 { &mut self.count } } fn main() { let mut c = Counter { count: 5 }; increment(&mut c); println!("{}", c.count); }

Результат выполнения кода:

6

Смотрите также

  • трейт AsRef,
    который выполняет неизменяемое преобразование ссылок
  • трейт DerefMut,
    который позволяет разыменовывать изменяемые ссылки
  • трейт Borrow,
    который предоставляет заимствование значения
  • трейт трейт,
    который описывает общее поведение типов
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить