AsRef in std::convert - Rust (original) (raw)
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:
- Unlike
AsRef
, Borrow has a blanket impl for anyT
, and can be used to accept either a reference or a value. - Borrow also requires that Hash, Eq and Ord for borrowed value are equivalent to those of the owned value. For this reason, if you want to borrow only a single field of a struct you can implement
AsRef
, but not Borrow.
Note: This trait must not fail. If the conversion can fail, use a dedicated method which returns an Option or a Result<T, E>.
AsRef
auto-dereferences if the inner type is a reference or a mutable reference (e.g.:foo.as_ref()
will work the same iffoo
has type&mut Foo
or&&mut Foo
)
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);