AsRef in std::convert - Rust (original) (raw)

logo

pub trait AsRef<T> where
    T: ?Sized, {
    fn as_ref(&self) -> &T;
}

Expand description

Used to do a cheap reference-to-reference conversion.

This trait is similar to AsMut which is used for converting between mutable references. If you need to do a costly conversion it is better to implement From with type&T or write a custom function.

AsRef has the same signature as Borrow, but Borrow is different in few aspects:

Note: This trait must not fail. If the conversion can fail, use a dedicated method which returns an Option or a Result<T, E>.

By using trait bounds we can accept arguments of different types as long as they can be converted to the specified type T.

For example: By creating a generic function that takes an AsRef<str> we express that we want to accept all references that can be converted to &str as an argument. Since both String and &str implement AsRef<str> we can accept both as input argument.

fn is_hello<T: AsRef<str>>(s: T) {
   assert_eq!("hello", s.as_ref());
}

let s = "hello";
is_hello(s);

let s = "hello".to_string();
is_hello(s);

Run