nju33
5/7/2017 - 3:39 PM

.rs

// https://ricardomartins.cc/2016/08/03/convenient_and_idiomatic_conversions_in_rust

// As lifts over &
// TはAsRef<U>を実装している
// ので T.as_ref()
// 
// > e as U というキャストは、 e が型 T を持ち、かつ T が U に 型強制 されるとき、有効
// つまり T は AsRef<U> を持っているもの
// AsRef<U>に変換されたので、U.as_ref(*self) になる
// U.as_ref は &U を返す
//
// &&&&vec.as_ref()
// > impl<T> AsRef<Vec<T>> for Vec<T>[src]
// >    fn as_ref(&self) -> &Vec<T>
// T = Vec<A>, U = Vec<A>
// <Vec<A> as AsRef<Vec<A>>>::as_ref(*self)
// *self = &selfのリアルの値 = Vec<A>::as_ref(*self) = &Vec<A>
#[stable(feature = "rust1", since = "1.0.0")]
impl<'a, T: ?Sized, U: ?Sized> AsRef<U> for &'a T where T: AsRef<U> {
    fn as_ref(&self) -> &U {
        <T as AsRef<U>>::as_ref(*self)
    }
}

// As lifts over &mut
#[stable(feature = "rust1", since = "1.0.0")]
impl<'a, T: ?Sized, U: ?Sized> AsRef<U> for &'a mut T where T: AsRef<U> {
    fn as_ref(&self) -> &U {
        <T as AsRef<U>>::as_ref(*self)
    }
}

// AsMut lifts over &mut
#[stable(feature = "rust1", since = "1.0.0")]
impl<'a, T: ?Sized, U: ?Sized> AsMut<U> for &'a mut T where T: AsMut<U> {
    fn as_mut(&mut self) -> &mut U {
        (*self).as_mut()
    }
}