Rust笔记 - AsRef and AsMut trait

1,706 阅读1分钟

在Rust中实现上述两个trait, 则表明能够将一个类型转换为另一个类型的引用。下面看一下定义:

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

下面实现一下:

struct Any<T, U> {
    t: T,
    u: U,
}

impl<T, U> AsRef<T> for Any<T, U> {
    fn as_ref(&self) -> &T {
        &self.t
    }
}

impl<T, U> AsMut<T> for Any<T, U> {
    fn as_mut(&mut self) -> &mut T {
        &mut self.t
    }
}

fn main() {
    let a = Any { t: vec![1, 2, 3], u: "hello world".to_owned() };
    assert_eq!(a.as_ref(), &vec![1, 2, 3]);

    let mut a = Any { t: vec![1, 2, 3], u: "hello world".to_owned() };
    a.as_mut()[1] = 4;
    assert_eq!(a.as_ref(), &vec![1, 4, 3]);
}