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
,Borrow
has a blanket impl for anyT
, and can be used to accept either a reference or a value. (See also note onAsRef
’s reflexibility below.) Borrow
also requires thatHash
,Eq
andOrd
for 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 gclient::ext::sp_runtime::offchain::http::Method
impl AsRef<str> for str
impl AsRef<str> for String
impl AsRef<str> for http::header::name::HeaderName
impl AsRef<str> for http::method::Method
impl AsRef<str> for http::uri::authority::Authority
impl AsRef<str> for http::uri::scheme::Scheme
impl AsRef<str> for Buffer
impl AsRef<str> for Url
Return the serialization of this URL.
impl AsRef<str> for Authority
impl AsRef<str> for Field
impl AsRef<str> for HeaderName
impl AsRef<str> for Method
impl AsRef<str> for PasswordHashString
impl AsRef<str> for SaltString
impl AsRef<str> for Scheme
impl AsRef<Pair> for gclient::ext::sp_runtime::app_crypto::ecdsa::AppPair
impl AsRef<Pair> for gclient::ext::sp_runtime::app_crypto::ed25519::AppPair
impl AsRef<Pair> for gclient::ext::sp_runtime::app_crypto::sr25519::AppPair
impl AsRef<Duration> for Duration
impl AsRef<Instant> for Instant
impl AsRef<SystemTime> for Timestamp
impl AsRef<CryptoBytes<sp_core::::ecdsa::Public::{constant#0}, (PublicTag, EcdsaTag)>> for gclient::ext::sp_runtime::app_crypto::ecdsa::AppPublic
impl AsRef<CryptoBytes<sp_core::::ecdsa::Signature::{constant#0}, (SignatureTag, EcdsaTag)>> for gclient::ext::sp_runtime::app_crypto::ecdsa::AppSignature
impl AsRef<CryptoBytes<sp_core::::ed25519::Public::{constant#0}, (PublicTag, Ed25519Tag)>> for gclient::ext::sp_runtime::app_crypto::ed25519::AppPublic
impl AsRef<CryptoBytes<sp_core::::ed25519::Signature::{constant#0}, (SignatureTag, Ed25519Tag)>> for gclient::ext::sp_runtime::app_crypto::ed25519::AppSignature
impl AsRef<CryptoBytes<sp_core::::sr25519::Signature::{constant#0}, (SignatureTag, Sr25519Tag)>> for gclient::ext::sp_runtime::app_crypto::sr25519::AppSignature
impl AsRef<VrfTranscript> for VrfSignData
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 std::path::Path
impl AsRef<OsStr> for PathBuf
impl AsRef<OsStr> for CanonicalPath
impl AsRef<OsStr> for Path
impl AsRef<Path> for gclient::ext::sp_core::bounded::alloc::borrow::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 std::path::Path
impl AsRef<Path> for PathBuf
impl AsRef<Path> for CanonicalPath
impl AsRef<Path> for Path
impl AsRef<Interval> for IntervalStream
impl AsRef<Keypair> for gclient::ext::sp_runtime::app_crypto::sr25519::Pair
impl AsRef<Semaphore> for PollSemaphore
impl AsRef<TcpStream> for OwnedReadHalf
impl AsRef<TcpStream> for OwnedWriteHalf
impl AsRef<TcpStream> for ReadHalf<'_>
impl AsRef<TcpStream> for WriteHalf<'_>
impl AsRef<UnixStream> for OwnedReadHalf
impl AsRef<UnixStream> for OwnedWriteHalf
impl AsRef<UnixStream> for ReadHalf<'_>
impl AsRef<UnixStream> for WriteHalf<'_>
impl AsRef<VerifyingKey> for SigningKey
impl AsRef<[u8; 4]> for Ipv4Addr
impl AsRef<[u8; 8]> for Hash
impl AsRef<[u8; 12]> for Nonce
impl AsRef<[u8; 16]> for Ipv6Addr
impl AsRef<[u8; 20]> for Hash
impl AsRef<[u8; 20]> for Hash
impl AsRef<[u8; 20]> for Hash
impl AsRef<[u8; 32]> for gclient::ext::sp_runtime::AccountId32
impl AsRef<[u8; 32]> for AccountId32
impl AsRef<[u8; 32]> for Hash
impl AsRef<[u8; 32]> for Hash
impl AsRef<[u8; 32]> for Hash
impl AsRef<[u8; 32]> for Message
impl AsRef<[u8; 32]> for SecretKey
impl AsRef<[u8; 64]> for ElligatorSwift
impl AsRef<[u8; 64]> for Hash
impl AsRef<[u8; 64]> for PublicKey
impl AsRef<[u8; 64]> for Signature
impl AsRef<[u8; 64]> for Signature
impl AsRef<[u8; 64]> for XOnlyPublicKey
impl AsRef<[u8; 65]> for RecoverableSignature
impl AsRef<[u8; 96]> for Keypair
impl AsRef<[u8]> for MultiSigner
impl AsRef<[u8]> for RuntimeString
impl AsRef<[u8]> for str
impl AsRef<[u8]> for gclient::ext::sp_runtime::app_crypto::ecdsa::AppPublic
impl AsRef<[u8]> for gclient::ext::sp_runtime::app_crypto::ecdsa::AppSignature
impl AsRef<[u8]> for gclient::ext::sp_runtime::app_crypto::ed25519::AppPublic
impl AsRef<[u8]> for gclient::ext::sp_runtime::app_crypto::ed25519::AppSignature
impl AsRef<[u8]> for gclient::ext::sp_runtime::app_crypto::sr25519::AppPublic
impl AsRef<[u8]> for gclient::ext::sp_runtime::app_crypto::sr25519::AppSignature
impl AsRef<[u8]> for gclient::ext::sp_runtime::AccountId32
impl AsRef<[u8]> for H256
impl AsRef<[u8]> for UintAuthorityId
impl AsRef<[u8]> for String
impl AsRef<[u8]> for StorageKey
impl AsRef<[u8]> for H160
impl AsRef<[u8]> for H512
impl AsRef<[u8]> for http::header::name::HeaderName
impl AsRef<[u8]> for http::header::value::HeaderValue
impl AsRef<[u8]> for AccountId32
impl AsRef<[u8]> for AeadKey
impl AsRef<[u8]> for AeadKey
impl AsRef<[u8]> for AlgorithmIdentifier
impl AsRef<[u8]> for ByteSlice125<'_>
impl AsRef<[u8]> for ByteSlice125<'_>
impl AsRef<[u8]> for Bytes
impl AsRef<[u8]> for BytesMut
impl AsRef<[u8]> for CertificateDer<'_>
impl AsRef<[u8]> for CertificateRevocationListDer<'_>
impl AsRef<[u8]> for CertificateSigningRequestDer<'_>
impl AsRef<[u8]> for Der<'_>
impl AsRef<[u8]> for Digest
impl AsRef<[u8]> for DistinguishedName
impl AsRef<[u8]> for DistinguishedName
impl AsRef<[u8]> for Document
impl AsRef<[u8]> for EchConfigListBytes<'_>
impl AsRef<[u8]> for H128
impl AsRef<[u8]> for H384
impl AsRef<[u8]> for H768
impl AsRef<[u8]> for Hash
impl AsRef<[u8]> for Hash
impl AsRef<[u8]> for Hash
impl AsRef<[u8]> for Hash
impl AsRef<[u8]> for Hash
impl AsRef<[u8]> for Hash
impl AsRef<[u8]> for Hash
impl AsRef<[u8]> for Hash
impl AsRef<[u8]> for Hash
impl AsRef<[u8]> for HeaderName
impl AsRef<[u8]> for HeaderValue
impl AsRef<[u8]> for Iv
impl AsRef<[u8]> for Iv
impl AsRef<[u8]> for Literal
impl AsRef<[u8]> for Literal
impl AsRef<[u8]> for Midstate
impl AsRef<[u8]> for ObjectIdentifier
impl AsRef<[u8]> for OkmBlock
impl AsRef<[u8]> for OkmBlock
impl AsRef<[u8]> for Output
impl AsRef<[u8]> for Output
impl AsRef<[u8]> for Output
impl AsRef<[u8]> for PrefixedPayload
impl AsRef<[u8]> for Protocol
impl AsRef<[u8]> for Protocol
impl AsRef<[u8]> for PublicKey
impl AsRef<[u8]> for PublicKey
impl AsRef<[u8]> for PublicKey
impl AsRef<[u8]> for ReasonPhrase
impl AsRef<[u8]> for SerializedSignature
impl AsRef<[u8]> for Signature
impl AsRef<[u8]> for SignatureArray
impl AsRef<[u8]> for SigningKey
impl AsRef<[u8]> for Storage<'_>
impl AsRef<[u8]> for Storage<'_>
impl AsRef<[u8]> for SubjectPublicKeyInfoDer<'_>
impl AsRef<[u8]> for Tag
impl AsRef<[u8]> for Tag
impl AsRef<[u8]> for Tag
impl AsRef<[u8]> for Tag
impl AsRef<[u8]> for Tag
impl AsRef<[u8]> for Tag
impl AsRef<[u8]> for VerificationKey
impl AsRef<[u8]> for VerificationKeyBytes
impl AsRef<[u8]> for VerifyingKey
impl AsRef<[u8]> for WabtBuf
impl AsRef<[u64]> for U256
Get a reference to the underlying little-endian words.
impl AsRef<[u64]> for U512
Get a reference to the underlying little-endian words.
impl AsRef<[u64]> for NonZeroU256
Get a reference to the underlying little-endian words.
impl AsRef<[u64]> for U128
Get a reference to the underlying little-endian words.
impl AsRef<dyn Error + Send + Sync> for Error
impl AsRef<dyn Error> for Error
impl<'a> AsRef<str> for gclient::ext::sp_core::bounded::alloc::string::Drain<'a>
impl<'a> AsRef<str> for DecimalStr<'a>
impl<'a> AsRef<str> for InfinityStr<'a>
impl<'a> AsRef<str> for MinusSignStr<'a>
impl<'a> AsRef<str> for NanStr<'a>
impl<'a> AsRef<str> for PlusSignStr<'a>
impl<'a> AsRef<str> for SeparatorStr<'a>
impl<'a> AsRef<str> for DnsName<'a>
impl<'a> AsRef<str> for Ident<'a>
impl<'a> AsRef<str> for Salt<'a>
impl<'a> AsRef<str> for Value<'a>
impl<'a> AsRef<[u8]> for gclient::ext::sp_core::bounded::alloc::string::Drain<'a>
impl<'a> AsRef<[Value]> for RuntimeArgs<'a>
impl<'a, T, A> AsRef<[T]> for gclient::ext::sp_core::bounded::alloc::vec::Drain<'a, T, A>where
A: Allocator,
impl<'a, T, A> AsRef<[T]> for Drain<'a, T, A>where
A: Allocator,
impl<'s, T> AsRef<[T]> for SliceVec<'s, T>
impl<A> AsRef<[<A as Array>::Item]> for ArrayVec<A>where
A: Array,
impl<A> AsRef<[<A as Array>::Item]> for SmallVec<A>where
A: Array,
impl<A> AsRef<[<A as Array>::Item]> for TinyVec<A>where
A: Array,
impl<A> AsRef<[u8]> for Aad<A>
impl<A, O> AsRef<BitSlice<<A as BitView>::Store, O>> for BitArray<A, O>where
A: BitViewSized,
O: BitOrder,
impl<B> AsRef<[u8]> for UnparsedPublicKey<B>
impl<B> AsRef<[u8]> for UnparsedPublicKey<B>
impl<K, V, S> AsRef<BTreeMap<K, V>> for BoundedBTreeMap<K, V, S>where
K: Ord,
impl<L, R> AsRef<str> for Either<L, R>
impl<L, R> AsRef<CStr> for Either<L, R>
Requires crate feature use_std
.
impl<L, R> AsRef<OsStr> for Either<L, R>
Requires crate feature use_std
.
impl<L, R> AsRef<Path> for Either<L, R>
Requires crate feature use_std
.