AsRef 与 AsMut

当一个类型实现了 AsRef<T> 后, 我们可以得到它的只读引用 &T; 当一个类型实现了 AsMut<T> 后, 我们可以得到它的可变更引用 &mut T.

它们的定义如下:

#![allow(unused)]
fn main() {
pub trait AsRef<T>where
    T: ?Sized,{
    // Required method
    fn as_ref(&self) -> &T;
}

pub trait AsMut<T>where
    T: ?Sized,{
    // Required method
    fn as_mut(&mut self) -> &mut T;
}
}

比如 String 实现了 AsRef<str>AsRef<[u8]>, 所以 String 可以作为 &str&[u8] 使用:

impl AsRef<str> for String {
    #[inline]
    fn as_ref(&self) -> &str {
        self
    }
}

impl AsMut<str> for String {
    #[inline]
    fn as_mut(&mut self) -> &mut str {
        self
    }
}

impl AsRef<[u8]> for String {
    #[inline]
    fn as_ref(&self) -> &[u8] {
        self.as_bytes()
    }
}

Vec<T> 也实现了 AsRef<[T]>, 所以它可以作为 &[T] 使用:

impl<T> AsRef<[T]> for Vec<T> {
    fn as_ref(&self) -> &[T] {
        self
    }
}

impl<T> AsMut<[T]> for Vec<T> {
    fn as_mut(&mut self) -> &mut [T] {
        self
    }
}