Трейт 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