Trait druid::piet::cairo::glib::bitflags::_core::convert::AsRef

1.0.0 · source ·
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 any T, and can be used to accept either a reference or a value. (See also note on AsRef’s reflexibility below.)
  • Borrow also requires that Hash, Eq and Ord 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 implement AsRef, but not Borrow.

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§

source

fn as_ref(&self) -> &T

Converts this type into a shared reference of the (usually inferred) input type.

Implementors§

source§

impl AsRef<str> for str

§

impl AsRef<str> for GStr

§

impl AsRef<str> for GString

§

impl AsRef<str> for GStringBuilder

source§

impl AsRef<str> for String

source§

impl AsRef<str> for Field

§

impl AsRef<Gradient> for LinearGradient

§

impl AsRef<Gradient> for RadialGradient

§

impl AsRef<ImageSurface> for MappedImageSurface

§

impl AsRef<Pattern> for Gradient

§

impl AsRef<Pattern> for LinearGradient

§

impl AsRef<Pattern> for Mesh

§

impl AsRef<Pattern> for Pattern

§

impl AsRef<Pattern> for RadialGradient

§

impl AsRef<Pattern> for SolidPattern

§

impl AsRef<Pattern> for SurfacePattern

§

impl AsRef<RectangleInt> for Rectangle

§

impl AsRef<Surface> for ImageSurface

§

impl AsRef<Surface> for RecordingSurface

§

impl AsRef<Surface> for Surface

§

impl AsRef<Surface> for XCBSurface

§

impl AsRef<Closure> for Closure

§

impl AsRef<Closure> for RustClosure

§

impl AsRef<GStr> for GStr

§

impl AsRef<GStr> for GString

§

impl AsRef<ParamSpec> for ParamSpec

§

impl AsRef<ParamSpec> for ParamSpecBoolean

§

impl AsRef<ParamSpec> for ParamSpecBoxed

§

impl AsRef<ParamSpec> for ParamSpecChar

§

impl AsRef<ParamSpec> for ParamSpecDouble

§

impl AsRef<ParamSpec> for ParamSpecEnum

§

impl AsRef<ParamSpec> for ParamSpecFlags

§

impl AsRef<ParamSpec> for ParamSpecFloat

§

impl AsRef<ParamSpec> for ParamSpecGType

§

impl AsRef<ParamSpec> for ParamSpecInt64

§

impl AsRef<ParamSpec> for ParamSpecInt

§

impl AsRef<ParamSpec> for ParamSpecLong

§

impl AsRef<ParamSpec> for ParamSpecObject

§

impl AsRef<ParamSpec> for ParamSpecOverride

§

impl AsRef<ParamSpec> for ParamSpecParam

§

impl AsRef<ParamSpec> for ParamSpecPointer

§

impl AsRef<ParamSpec> for ParamSpecString

§

impl AsRef<ParamSpec> for ParamSpecUChar

§

impl AsRef<ParamSpec> for ParamSpecUInt64

§

impl AsRef<ParamSpec> for ParamSpecUInt

§

impl AsRef<ParamSpec> for ParamSpecULong

§

impl AsRef<ParamSpec> for ParamSpecUnichar

§

impl AsRef<ParamSpec> for ParamSpecValueArray

§

impl AsRef<ParamSpec> for ParamSpecVariant

§

impl AsRef<Variant> for Variant

§

impl AsRef<VariantTy> for VariantTy

§

impl AsRef<VariantTy> for VariantType

§

impl AsRef<CStr> for GStr

§

impl AsRef<CStr> for GString

1.7.0 · source§

impl AsRef<CStr> for CStr

1.7.0 · source§

impl AsRef<CStr> for CString

source§

impl AsRef<OsStr> for Component<'_>

source§

impl AsRef<OsStr> for str

§

impl AsRef<OsStr> for GStr

§

impl AsRef<OsStr> for GString

source§

impl AsRef<OsStr> for String

source§

impl AsRef<OsStr> for OsStr

source§

impl AsRef<OsStr> for OsString

source§

impl AsRef<OsStr> for Components<'_>

source§

impl AsRef<OsStr> for std::path::Iter<'_>

source§

impl AsRef<OsStr> for Path

source§

impl AsRef<OsStr> for PathBuf

1.8.0 · source§

impl AsRef<Path> for Cow<'_, OsStr>

1.25.0 · source§

impl AsRef<Path> for Component<'_>

source§

impl AsRef<Path> for str

§

impl AsRef<Path> for GStr

§

impl AsRef<Path> for GString

source§

impl AsRef<Path> for String

source§

impl AsRef<Path> for OsStr

source§

impl AsRef<Path> for OsString

source§

impl AsRef<Path> for Components<'_>

source§

impl AsRef<Path> for std::path::Iter<'_>

source§

impl AsRef<Path> for Path

source§

impl AsRef<Path> for PathBuf

§

impl AsRef<Attribute> for AttrColor

§

impl AsRef<Attribute> for AttrFloat

§

impl AsRef<Attribute> for AttrFontDesc

§

impl AsRef<Attribute> for AttrFontFeatures

§

impl AsRef<Attribute> for AttrInt

§

impl AsRef<Attribute> for AttrLanguage

§

impl AsRef<Attribute> for AttrShape

§

impl AsRef<Attribute> for AttrSize

§

impl AsRef<Attribute> for AttrString

§

impl AsRef<GdkEventAny> for Event

§

impl AsRef<GdkEventButton> for EventButton

§

impl AsRef<GdkEventConfigure> for EventConfigure

§

impl AsRef<GdkEventCrossing> for EventCrossing

§

impl AsRef<GdkEventDND> for EventDND

§

impl AsRef<GdkEventExpose> for EventExpose

§

impl AsRef<GdkEventFocus> for EventFocus

§

impl AsRef<GdkEventGrabBroken> for EventGrabBroken

§

impl AsRef<GdkEventKey> for EventKey

§

impl AsRef<GdkEventMotion> for EventMotion

§

impl AsRef<GdkEventOwnerChange> for EventOwnerChange

§

impl AsRef<GdkEventPadAxis> for EventPadAxis

§

impl AsRef<GdkEventPadButton> for EventPadButton

§

impl AsRef<GdkEventPadGroupMode> for EventPadGroupMode

§

impl AsRef<GdkEventProperty> for EventProperty

§

impl AsRef<GdkEventProximity> for EventProximity

§

impl AsRef<GdkEventScroll> for EventScroll

§

impl AsRef<GdkEventSelection> for EventSelection

§

impl AsRef<GdkEventSetting> for EventSetting

§

impl AsRef<GdkEventTouch> for EventTouch

§

impl AsRef<GdkEventTouchpadPinch> for EventTouchpadPinch

§

impl AsRef<GdkEventTouchpadSwipe> for EventTouchpadSwipe

§

impl AsRef<GdkEventVisibility> for EventVisibility

§

impl AsRef<GdkEventWindowState> for EventWindowState

§

impl AsRef<LanguageIdentifier> for LanguageIdentifier

source§

impl AsRef<[u8]> for str

§

impl AsRef<[u8]> for ImageSurfaceDataOwned

§

impl AsRef<[u8]> for ByteArray

§

impl AsRef<[u8]> for Bytes

§

impl AsRef<[u8]> for GStr

§

impl AsRef<[u8]> for GString

§

impl AsRef<[u8]> for GStringBuilder

source§

impl AsRef<[u8]> for String

§

impl AsRef<[u8]> for Literal

§

impl AsRef<[u8]> for Mmap

§

impl AsRef<[u8]> for MmapMut

source§

impl AsRef<dyn Error + 'static> for Error

source§

impl AsRef<dyn Error + Sync + Send + 'static> for Error

1.55.0 · source§

impl<'a> AsRef<str> for alloc::string::Drain<'a>

§

impl<'a> AsRef<Face<'a>> for Face<'a>

1.55.0 · source§

impl<'a> AsRef<[u8]> for alloc::string::Drain<'a>

§

impl<'a, T> AsRef<T> for BorrowedObject<'a, T>

1.46.0 · source§

impl<'a, T, A> AsRef<[T]> for alloc::vec::drain::Drain<'a, T, A>where A: Allocator,

§

impl<A> AsRef<[<A as Array>::Item]> for SmallVec<A>where A: Array,

§

impl<A, N> AsRef<[A]> for Chunk<A, N>where N: ChunkLength<A>,

§

impl<A, T> AsRef<[A]> for InlineArray<A, T>

§

impl<A, T> AsRef<[T]> for FixedSizeVariantArray<A, T>where A: AsRef<[T]>, T: FixedSizeVariantType,

§

impl<A, T> AsRef<A> for FixedSizeVariantArray<A, T>where A: AsRef<[T]>, T: FixedSizeVariantType,

source§

impl<K, V> AsRef<OrdMap<K, V>> for OrdMap<K, V>

source§

impl<K, V, S> AsRef<HashMap<K, V, S>> for HashMap<K, V, S>

§

impl<T> AsRef<<T as ObjectType>::GlibClassType> for Class<T>where T: IsClass,

§

impl<T> AsRef<<T as ObjectType>::GlibClassType> for Interface<T>where T: IsInterface,

source§

impl<T> AsRef<[T]> for [T]

§

impl<T> AsRef<[T]> for PtrSlice<T>where T: GlibPtrDefault + FromGlibPtrFull<<T as GlibPtrDefault>::GlibType> + FromGlibPtrNone<<T as GlibPtrDefault>::GlibType>,

§

impl<T> AsRef<[T]> for Slice<T>where T: 'static,

1.13.0 · source§

impl<T> AsRef<[T]> for druid::piet::cairo::glib::bitflags::_core::slice::Iter<'_, T>

1.53.0 · source§

impl<T> AsRef<[T]> for IterMut<'_, T>

§

impl<T> AsRef<[T]> for RGB<T>

§

impl<T> AsRef<[T]> for RGBA<T, T>

source§

impl<T> AsRef<T> for Cow<'_, T>where T: ToOwned + ?Sized,

§

impl<T> AsRef<T> for Borrowed<T>

1.5.0 · source§

impl<T> AsRef<T> for Rc<T>where T: ?Sized,

1.5.0 · source§

impl<T> AsRef<T> for Arc<T>where T: ?Sized,

§

impl<T> AsRef<T> for Gray<T>

§

impl<T> AsRef<T> for GrayAlpha<T, T>

1.46.0 · source§

impl<T, A> AsRef<[T]> for IntoIter<T, A>where A: Allocator,

source§

impl<T, A> AsRef<[T]> for Vec<T, A>where A: Allocator,

source§

impl<T, A> AsRef<Vec<T, A>> for Vec<T, A>where A: Allocator,

1.5.0 · source§

impl<T, A> AsRef<T> for Box<T, A>where A: Allocator, T: ?Sized,

const: unstable · source§

impl<T, U> AsRef<U> for &Twhere T: AsRef<U> + ?Sized, U: ?Sized,

const: unstable · source§

impl<T, U> AsRef<U> for &mut Twhere T: AsRef<U> + ?Sized, U: ?Sized,

source§

impl<T, const CAP: usize> AsRef<[T]> for ArrayVec<T, CAP>

source§

impl<T, const LANES: usize> AsRef<[T; LANES]> for Simd<T, LANES>where LaneCount<LANES>: SupportedLaneCount, T: SimdElement,

source§

impl<T, const LANES: usize> AsRef<[T]> for Simd<T, LANES>where LaneCount<LANES>: SupportedLaneCount, T: SimdElement,

source§

impl<T, const N: usize> AsRef<[T]> for [T; N]

source§

impl<const CAP: usize> AsRef<str> for ArrayString<CAP>