pub trait AsRef<T>where
T: ?Sized,{
// Required method
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.
§Relation to Borrow
AsRef has the same signature as Borrow, but Borrow is different in a few aspects:
- Unlike
AsRef,Borrowhas a blanket impl for anyT, and can be used to accept either a reference or a value. (See also note onAsRef’s reflexibility below.) Borrowalso requires thatHash,EqandOrdfor a 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 implementAsRef, but notBorrow.
Note: This trait must not fail. If the conversion can fail, use a
dedicated method which returns an Option<T> or a Result<T, E>.
§Generic Implementations
AsRef auto-dereferences if the inner type is a reference or a mutable reference
(e.g.: foo.as_ref() will work the same if foo has type &mut Foo or &&mut Foo).
Note that due to historic reasons, the above currently does not hold generally for all
dereferenceable types, e.g. foo.as_ref() will not work the same as
Box::new(foo).as_ref(). Instead, many smart pointers provide an as_ref implementation which
simply returns a reference to the pointed-to value (but do not perform a cheap
reference-to-reference conversion for that value). However, AsRef::as_ref should not be
used for the sole purpose of dereferencing; instead ‘Deref coercion’ can be used:
let x = Box::new(5i32);
// Avoid this:
// let y: &i32 = x.as_ref();
// Better just write:
let y: &i32 = &x;Types which implement Deref should consider implementing AsRef<T> as follows:
impl<T> AsRef<T> for SomeType
where
T: ?Sized,
<SomeType as Deref>::Target: AsRef<T>,
{
fn as_ref(&self) -> &T {
self.deref().as_ref()
}
}§Reflexivity
Ideally, AsRef would be reflexive, i.e. there would be an impl<T: ?Sized> AsRef<T> for T
with as_ref simply returning its argument unchanged.
Such a blanket implementation is currently not provided due to technical restrictions of
Rust’s type system (it would be overlapping with another existing blanket implementation for
&T where T: AsRef<U> which allows AsRef to auto-dereference, see “Generic Implementations”
above).
A trivial implementation of AsRef<T> for T must be added explicitly for a particular type T
where needed or desired. Note, however, that not all types from std contain such an
implementation, and those cannot be added by external code due to orphan rules.
§Examples
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);Required Methods§
Implementors§
impl AsRef<str> for str
impl AsRef<str> for String
impl AsRef<Felt> for Felt
impl AsRef<ByteStr> for str
impl AsRef<ByteStr> for ByteString
impl AsRef<ByteStr> for ByteStr
impl AsRef<CStr> for CString
impl AsRef<CStr> for CStr
impl AsRef<LocalWaker> for Waker
impl AsRef<OsStr> for Component<'_>
impl AsRef<OsStr> for str
impl AsRef<OsStr> for String
impl AsRef<OsStr> for OsStr
impl AsRef<OsStr> for OsString
impl AsRef<OsStr> for Components<'_>
impl AsRef<OsStr> for std::path::Iter<'_>
impl AsRef<OsStr> for Path
impl AsRef<OsStr> for PathBuf
impl AsRef<Path> for Cow<'_, OsStr>
impl AsRef<Path> for Component<'_>
impl AsRef<Path> for str
impl AsRef<Path> for String
impl AsRef<Path> for OsStr
impl AsRef<Path> for OsString
impl AsRef<Path> for Components<'_>
impl AsRef<Path> for std::path::Iter<'_>
impl AsRef<Path> for Path
impl AsRef<Path> for PathBuf
impl AsRef<NonZeroFelt> for NonZeroFelt
impl AsRef<[u8]> for str
impl AsRef<[u8]> for String
impl AsRef<[u8]> for ByteString
impl AsRef<[u8]> for ByteStr
impl AsRef<dyn Error + Send + Sync> for Error
std or non-anyhow_no_core_error only.impl AsRef<dyn Error> for Error
std or non-anyhow_no_core_error only.impl<'a> AsRef<str> for cairo_vm::with_std::string::Drain<'a>
impl<'a> AsRef<[u8]> for cairo_vm::with_std::string::Drain<'a>
impl<'a, T, A> AsRef<[T]> for cairo_vm::with_std::vec::Drain<'a, T, A>where
A: Allocator,
impl<'a, T, A> AsRef<[T]> for allocator_api2::stable::vec::drain::Drain<'a, T, A>where
A: Allocator,
impl<A, O> AsRef<BitSlice<<A as BitView>::Store, O>> for BitArray<A, O>where
A: BitViewSized,
O: BitOrder,
tarpaulin_include only.impl<L, R> AsRef<str> for Either<L, R>
impl<L, R> AsRef<CStr> for Either<L, R>
std only.Requires crate feature std.
impl<L, R> AsRef<OsStr> for Either<L, R>
std only.Requires crate feature std.
impl<L, R> AsRef<Path> for Either<L, R>
std only.Requires crate feature std.
impl<L, R, Target> AsRef<[Target]> for Either<L, R>
impl<L, R, Target> AsRef<Target> for Either<L, R>
impl<M, T, O> AsRef<bool> for BitRef<'_, M, T, O>
tarpaulin_include only.impl<O> AsRef<[u8; 2]> for I16<O>
impl<O> AsRef<[u8; 2]> for U16<O>
impl<O> AsRef<[u8; 4]> for F32<O>
impl<O> AsRef<[u8; 4]> for I32<O>
impl<O> AsRef<[u8; 4]> for U32<O>
impl<O> AsRef<[u8; 8]> for F64<O>
impl<O> AsRef<[u8; 8]> for I64<O>
impl<O> AsRef<[u8; 8]> for Isize<O>
impl<O> AsRef<[u8; 8]> for U64<O>
impl<O> AsRef<[u8; 8]> for Usize<O>
impl<O> AsRef<[u8; 16]> for I128<O>
impl<O> AsRef<[u8; 16]> for U128<O>
impl<T> AsRef<[T; 1]> for GenericArray<T, UInt<UTerm, B1>>
impl<T> AsRef<[T; 2]> for GenericArray<T, UInt<UInt<UTerm, B1>, B0>>
impl<T> AsRef<[T; 3]> for GenericArray<T, UInt<UInt<UTerm, B1>, B1>>
impl<T> AsRef<[T; 4]> for GenericArray<T, UInt<UInt<UInt<UTerm, B1>, B0>, B0>>
impl<T> AsRef<[T; 5]> for GenericArray<T, UInt<UInt<UInt<UTerm, B1>, B0>, B1>>
impl<T> AsRef<[T; 6]> for GenericArray<T, UInt<UInt<UInt<UTerm, B1>, B1>, B0>>
impl<T> AsRef<[T; 7]> for GenericArray<T, UInt<UInt<UInt<UTerm, B1>, B1>, B1>>
impl<T> AsRef<[T; 8]> for GenericArray<T, UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B0>, B0>>
impl<T> AsRef<[T; 9]> for GenericArray<T, UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B0>, B1>>
impl<T> AsRef<[T; 10]> for GenericArray<T, UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B1>, B0>>
impl<T> AsRef<[T; 11]> for GenericArray<T, UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B1>, B1>>
impl<T> AsRef<[T; 12]> for GenericArray<T, UInt<UInt<UInt<UInt<UTerm, B1>, B1>, B0>, B0>>
impl<T> AsRef<[T; 13]> for GenericArray<T, UInt<UInt<UInt<UInt<UTerm, B1>, B1>, B0>, B1>>
impl<T> AsRef<[T; 14]> for GenericArray<T, UInt<UInt<UInt<UInt<UTerm, B1>, B1>, B1>, B0>>
impl<T> AsRef<[T; 15]> for GenericArray<T, UInt<UInt<UInt<UInt<UTerm, B1>, B1>, B1>, B1>>
impl<T> AsRef<[T; 16]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B0>, B0>, B0>>
impl<T> AsRef<[T; 17]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B0>, B0>, B1>>
impl<T> AsRef<[T; 18]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B0>, B1>, B0>>
impl<T> AsRef<[T; 19]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B0>, B1>, B1>>
impl<T> AsRef<[T; 20]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B1>, B0>, B0>>
impl<T> AsRef<[T; 21]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B1>, B0>, B1>>
impl<T> AsRef<[T; 22]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B1>, B1>, B0>>
impl<T> AsRef<[T; 23]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B1>, B1>, B1>>
impl<T> AsRef<[T; 24]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B1>, B0>, B0>, B0>>
impl<T> AsRef<[T; 25]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B1>, B0>, B0>, B1>>
impl<T> AsRef<[T; 26]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B1>, B0>, B1>, B0>>
impl<T> AsRef<[T; 27]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B1>, B0>, B1>, B1>>
impl<T> AsRef<[T; 28]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B1>, B1>, B0>, B0>>
impl<T> AsRef<[T; 29]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B1>, B1>, B0>, B1>>
impl<T> AsRef<[T; 30]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B1>, B1>, B1>, B0>>
impl<T> AsRef<[T; 31]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B1>, B1>, B1>, B1>>
impl<T> AsRef<[T; 32]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B0>, B0>, B0>, B0>>
impl<T> AsRef<[T; 33]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B0>, B0>, B0>, B1>>
impl<T> AsRef<[T; 34]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B0>, B0>, B1>, B0>>
impl<T> AsRef<[T; 35]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B0>, B0>, B1>, B1>>
impl<T> AsRef<[T; 36]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B0>, B1>, B0>, B0>>
impl<T> AsRef<[T; 37]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B0>, B1>, B0>, B1>>
impl<T> AsRef<[T; 38]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B0>, B1>, B1>, B0>>
impl<T> AsRef<[T; 39]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B0>, B1>, B1>, B1>>
impl<T> AsRef<[T; 40]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B1>, B0>, B0>, B0>>
impl<T> AsRef<[T; 41]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B1>, B0>, B0>, B1>>
impl<T> AsRef<[T; 42]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B1>, B0>, B1>, B0>>
impl<T> AsRef<[T; 43]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B1>, B0>, B1>, B1>>
impl<T> AsRef<[T; 44]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B1>, B1>, B0>, B0>>
impl<T> AsRef<[T; 45]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B1>, B1>, B0>, B1>>
impl<T> AsRef<[T; 46]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B1>, B1>, B1>, B0>>
impl<T> AsRef<[T; 47]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B1>, B1>, B1>, B1>>
impl<T> AsRef<[T; 48]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B1>, B0>, B0>, B0>, B0>>
impl<T> AsRef<[T; 49]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B1>, B0>, B0>, B0>, B1>>
impl<T> AsRef<[T; 50]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B1>, B0>, B0>, B1>, B0>>
impl<T> AsRef<[T; 51]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B1>, B0>, B0>, B1>, B1>>
impl<T> AsRef<[T; 52]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B1>, B0>, B1>, B0>, B0>>
impl<T> AsRef<[T; 53]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B1>, B0>, B1>, B0>, B1>>
impl<T> AsRef<[T; 54]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B1>, B0>, B1>, B1>, B0>>
impl<T> AsRef<[T; 55]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B1>, B0>, B1>, B1>, B1>>
impl<T> AsRef<[T; 56]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B1>, B1>, B0>, B0>, B0>>
impl<T> AsRef<[T; 57]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B1>, B1>, B0>, B0>, B1>>
impl<T> AsRef<[T; 58]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B1>, B1>, B0>, B1>, B0>>
impl<T> AsRef<[T; 59]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B1>, B1>, B0>, B1>, B1>>
impl<T> AsRef<[T; 60]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B1>, B1>, B1>, B0>, B0>>
impl<T> AsRef<[T; 61]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B1>, B1>, B1>, B0>, B1>>
impl<T> AsRef<[T; 62]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B1>, B1>, B1>, B1>, B0>>
impl<T> AsRef<[T; 63]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B1>, B1>, B1>, B1>, B1>>
impl<T> AsRef<[T; 64]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B0>, B0>, B0>, B0>, B0>>
impl<T> AsRef<[T; 70]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B0>, B0>, B1>, B1>, B0>>
impl<T> AsRef<[T; 80]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B1>, B0>, B0>, B0>, B0>>
impl<T> AsRef<[T; 90]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B1>, B1>, B0>, B1>, B0>>
impl<T> AsRef<[T; 100]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B1>, B0>, B0>, B1>, B0>, B0>>
impl<T> AsRef<[T; 128]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B0>, B0>, B0>, B0>, B0>, B0>>
impl<T> AsRef<[T; 200]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B1>, B0>, B0>, B1>, B0>, B0>, B0>>
impl<T> AsRef<[T; 256]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B0>, B0>, B0>, B0>, B0>, B0>, B0>>
impl<T> AsRef<[T; 300]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B0>, B1>, B0>, B1>, B1>, B0>, B0>>
impl<T> AsRef<[T; 400]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B1>, B0>, B0>, B1>, B0>, B0>, B0>, B0>>
impl<T> AsRef<[T; 500]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B1>, B1>, B1>, B1>, B0>, B1>, B0>, B0>>
impl<T> AsRef<[T; 512]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B0>, B0>, B0>, B0>, B0>, B0>, B0>, B0>>
impl<T> AsRef<[T; 1000]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B1>, B1>, B1>, B1>, B0>, B1>, B0>, B0>, B0>>
impl<T> AsRef<[T; 1024]> for GenericArray<T, UInt<UInt<UInt<UInt<UInt<UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B0>, B0>, B0>, B0>, B0>, B0>, B0>, B0>, B0>>
impl<T> AsRef<[T]> for [T]
impl<T> AsRef<[T]> for cairo_vm::with_std::slice::Iter<'_, T>
impl<T> AsRef<[T]> for cairo_vm::with_std::slice::IterMut<'_, T>
impl<T> AsRef<T> for Cow<'_, T>
impl<T> AsRef<T> for Exclusive<T>
impl<T> AsRef<T> for NonZero<T>where
T: Zero,
impl<T> AsRef<T> for FmtBinary<T>where
T: Binary,
tarpaulin_include only.impl<T> AsRef<T> for FmtDisplay<T>where
T: Display,
tarpaulin_include only.impl<T> AsRef<T> for FmtList<T>where
&'a T: for<'a> IntoIterator,
tarpaulin_include only.impl<T> AsRef<T> for FmtLowerExp<T>where
T: LowerExp,
tarpaulin_include only.impl<T> AsRef<T> for FmtLowerHex<T>where
T: LowerHex,
tarpaulin_include only.impl<T> AsRef<T> for FmtOctal<T>where
T: Octal,
tarpaulin_include only.impl<T> AsRef<T> for FmtPointer<T>where
T: Pointer,
tarpaulin_include only.impl<T> AsRef<T> for FmtUpperExp<T>where
T: UpperExp,
tarpaulin_include only.impl<T> AsRef<T> for FmtUpperHex<T>where
T: UpperHex,
tarpaulin_include only.impl<T, A> AsRef<[T]> for cairo_vm::with_std::vec::IntoIter<T, A>where
A: Allocator,
impl<T, A> AsRef<[T]> for cairo_vm::with_std::vec::Vec<T, A>where
A: Allocator,
impl<T, A> AsRef<[T]> for allocator_api2::stable::vec::into_iter::IntoIter<T, A>where
A: Allocator,
impl<T, A> AsRef<[T]> for allocator_api2::stable::vec::Vec<T, A>where
A: Allocator,
impl<T, A> AsRef<Vec<T, A>> for cairo_vm::with_std::vec::Vec<T, A>where
A: Allocator,
impl<T, A> AsRef<Vec<T, A>> for allocator_api2::stable::vec::Vec<T, A>where
A: Allocator,
impl<T, A> AsRef<T> for cairo_vm::with_std::boxed::Box<T, A>
impl<T, A> AsRef<T> for Rc<T, A>
impl<T, A> AsRef<T> for UniqueRc<T, A>
impl<T, A> AsRef<T> for Arc<T, A>
impl<T, A> AsRef<T> for UniqueArc<T, A>
impl<T, A> AsRef<T> for allocator_api2::stable::boxed::Box<T, A>
impl<T, N> AsRef<[T]> for GenericArray<T, N>where
N: ArrayLength<T>,
impl<T, O> AsRef<BitSlice<<T as BitStore>::Alias, O>> for bitvec::slice::iter::IterMut<'_, T, O>
tarpaulin_include only.impl<T, O> AsRef<BitSlice<T, O>> for bitvec::boxed::iter::IntoIter<T, O>
tarpaulin_include only.impl<T, O> AsRef<BitSlice<T, O>> for BitBox<T, O>
tarpaulin_include only.impl<T, O> AsRef<BitSlice<T, O>> for bitvec::slice::iter::Iter<'_, T, O>
tarpaulin_include only.impl<T, O> AsRef<BitSlice<T, O>> for BitSlice<T, O>
impl<T, O> AsRef<BitSlice<T, O>> for bitvec::vec::iter::Drain<'_, T, O>
tarpaulin_include only.impl<T, O> AsRef<BitSlice<T, O>> for BitVec<T, O>
tarpaulin_include only.impl<T, O> AsRef<BitVec<T, O>> for BitVec<T, O>
tarpaulin_include only.