ReflectFromReflect

Struct ReflectFromReflect 

Source
pub struct ReflectFromReflect { /* private fields */ }
Expand description

Type data that represents the FromReflect trait and allows it to be used dynamically.

FromReflect allows dynamic types (e.g. DynamicStruct, DynamicEnum, etc.) to be converted to their full, concrete types. This is most important when it comes to deserialization where it isn’t guaranteed that every field exists when trying to construct the final output.

However, to do this, you normally need to specify the exact concrete type:

#[derive(Reflect, PartialEq, Eq, Debug)]
struct Foo(#[reflect(default = "default_value")] usize);

fn default_value() -> usize { 123 }

let reflected = DynamicTupleStruct::default();

let concrete: Foo = <Foo as FromReflect>::from_reflect(&reflected).unwrap();

assert_eq!(Foo(123), concrete);

In a dynamic context where the type might not be known at compile-time, this is nearly impossible to do. That is why this type data struct exists— it allows us to construct the full type without knowing what the actual type is.

§Example


let mut reflected = DynamicTupleStruct::default();
reflected.set_represented_type(Some(<Foo as Typed>::type_info()));

let registration = registry.get_with_type_path(<Foo as TypePath>::type_path()).unwrap();
let rfr = registration.data::<ReflectFromReflect>().unwrap();

let concrete: Box<dyn Reflect> = rfr.from_reflect(&reflected).unwrap();

assert_eq!(Foo(123), concrete.take::<Foo>().unwrap());

Implementations§

Source§

impl ReflectFromReflect

Source

pub fn from_reflect( &self, reflect_value: &(dyn PartialReflect + 'static), ) -> Option<Box<dyn Reflect>>

Perform a FromReflect::from_reflect conversion on the given reflection object.

This will convert the object to a concrete type if it wasn’t already, and return the value as Box<dyn Reflect>.

Examples found in repository?
examples/reflection/dynamic_types.rs (line 138)
12fn main() {
13    #[derive(Reflect, Default, PartialEq, Debug)]
14    #[reflect(Identifiable, Default)]
15    struct Player {
16        id: u32,
17    }
18
19    #[reflect_trait]
20    trait Identifiable {
21        fn id(&self) -> u32;
22    }
23
24    impl Identifiable for Player {
25        fn id(&self) -> u32 {
26            self.id
27        }
28    }
29
30    // Normally, when instantiating a type, you get back exactly that type.
31    // This is because the type is known at compile time.
32    // We call this the "concrete" or "canonical" type.
33    let player: Player = Player { id: 123 };
34
35    // When working with reflected types, however, we often "erase" this type information
36    // using the `Reflect` trait object.
37    // This trait object also gives us access to all the methods in the `PartialReflect` trait too.
38    // The underlying type is still the same (in this case, `Player`),
39    // but now we've hidden that information from the compiler.
40    let reflected: Box<dyn Reflect> = Box::new(player);
41
42    // Because it's the same type under the hood, we can still downcast it back to the original type.
43    assert!(reflected.downcast_ref::<Player>().is_some());
44
45    // We can attempt to clone our value using `PartialReflect::reflect_clone`.
46    // This will recursively call `PartialReflect::reflect_clone` on all fields of the type.
47    // Or, if we had registered `ReflectClone` using `#[reflect(Clone)]`, it would simply call `Clone::clone` directly.
48    let cloned: Box<dyn Reflect> = reflected.reflect_clone().unwrap();
49    assert_eq!(cloned.downcast_ref::<Player>(), Some(&Player { id: 123 }));
50
51    // Another way we can "clone" our data is by converting it to a dynamic type.
52    // Notice here we bind it as a `dyn PartialReflect` instead of `dyn Reflect`.
53    // This is because it returns a dynamic type that simply represents the original type.
54    // In this case, because `Player` is a struct, it will return a `DynamicStruct`.
55    let dynamic: Box<dyn PartialReflect> = reflected.to_dynamic();
56    assert!(dynamic.is_dynamic());
57
58    // And if we try to convert it back to a `dyn Reflect` trait object, we'll get `None`.
59    // Dynamic types cannot be directly cast to `dyn Reflect` trait objects.
60    assert!(dynamic.try_as_reflect().is_none());
61
62    // Generally dynamic types are used to represent (or "proxy") the original type,
63    // so that we can continue to access its fields and overall structure.
64    let dynamic_ref = dynamic.reflect_ref().as_struct().unwrap();
65    let id = dynamic_ref.field("id").unwrap().try_downcast_ref::<u32>();
66    assert_eq!(id, Some(&123));
67
68    // It also enables us to create a representation of a type without having compile-time
69    // access to the actual type. This is how the reflection deserializers work.
70    // They generally can't know how to construct a type ahead of time,
71    // so they instead build and return these dynamic representations.
72    let input = "(id: 123)";
73    let mut registry = TypeRegistry::default();
74    registry.register::<Player>();
75    let registration = registry.get(std::any::TypeId::of::<Player>()).unwrap();
76    let deserialized = TypedReflectDeserializer::new(registration, &registry)
77        .deserialize(&mut ron::Deserializer::from_str(input).unwrap())
78        .unwrap();
79
80    // Our deserialized output is a `DynamicStruct` that proxies/represents a `Player`.
81    assert!(deserialized.represents::<Player>());
82
83    // And while this does allow us to access the fields and structure of the type,
84    // there may be instances where we need the actual type.
85    // For example, if we want to convert our `dyn Reflect` into a `dyn Identifiable`,
86    // we can't use the `DynamicStruct` proxy.
87    let reflect_identifiable = registration
88        .data::<ReflectIdentifiable>()
89        .expect("`ReflectIdentifiable` should be registered");
90
91    // Trying to access the registry with our `deserialized` will give a compile error
92    // since it doesn't implement `Reflect`, only `PartialReflect`.
93    // Similarly, trying to force the operation will fail.
94    // This fails since the underlying type of `deserialized` is `DynamicStruct` and not `Player`.
95    assert!(deserialized
96        .try_as_reflect()
97        .and_then(|reflect_trait_obj| reflect_identifiable.get(reflect_trait_obj))
98        .is_none());
99
100    // So how can we go from a dynamic type to a concrete type?
101    // There are two ways:
102
103    // 1. Using `PartialReflect::apply`.
104    {
105        // If you know the type at compile time, you can construct a new value and apply the dynamic
106        // value to it.
107        let mut value = Player::default();
108        value.apply(deserialized.as_ref());
109        assert_eq!(value.id, 123);
110
111        // If you don't know the type at compile time, you need a dynamic way of constructing
112        // an instance of the type. One such way is to use the `ReflectDefault` type data.
113        let reflect_default = registration
114            .data::<ReflectDefault>()
115            .expect("`ReflectDefault` should be registered");
116
117        let mut value: Box<dyn Reflect> = reflect_default.default();
118        value.apply(deserialized.as_ref());
119
120        let identifiable: &dyn Identifiable = reflect_identifiable.get(value.as_reflect()).unwrap();
121        assert_eq!(identifiable.id(), 123);
122    }
123
124    // 2. Using `FromReflect`
125    {
126        // If you know the type at compile time, you can use the `FromReflect` trait to convert the
127        // dynamic value into the concrete type directly.
128        let value: Player = Player::from_reflect(deserialized.as_ref()).unwrap();
129        assert_eq!(value.id, 123);
130
131        // If you don't know the type at compile time, you can use the `ReflectFromReflect` type data
132        // to perform the conversion dynamically.
133        let reflect_from_reflect = registration
134            .data::<ReflectFromReflect>()
135            .expect("`ReflectFromReflect` should be registered");
136
137        let value: Box<dyn Reflect> = reflect_from_reflect
138            .from_reflect(deserialized.as_ref())
139            .unwrap();
140        let identifiable: &dyn Identifiable = reflect_identifiable.get(value.as_reflect()).unwrap();
141        assert_eq!(identifiable.id(), 123);
142    }
143
144    // Lastly, while dynamic types are commonly generated via reflection methods like
145    // `PartialReflect::to_dynamic` or via the reflection deserializers,
146    // you can also construct them manually.
147    let mut my_dynamic_list = DynamicList::from_iter([1u32, 2u32, 3u32]);
148
149    // This is useful when you just need to apply some subset of changes to a type.
150    let mut my_list: Vec<u32> = Vec::new();
151    my_list.apply(&my_dynamic_list);
152    assert_eq!(my_list, vec![1, 2, 3]);
153
154    // And if you want it to actually proxy a type, you can configure it to do that as well:
155    assert!(!my_dynamic_list
156        .as_partial_reflect()
157        .represents::<Vec<u32>>());
158    my_dynamic_list.set_represented_type(Some(<Vec<u32>>::type_info()));
159    assert!(my_dynamic_list
160        .as_partial_reflect()
161        .represents::<Vec<u32>>());
162
163    // ============================= REFERENCE ============================= //
164    // For reference, here are all the available dynamic types:
165
166    // 1. `DynamicTuple`
167    {
168        let mut dynamic_tuple = DynamicTuple::default();
169        dynamic_tuple.insert(1u32);
170        dynamic_tuple.insert(2u32);
171        dynamic_tuple.insert(3u32);
172
173        let mut my_tuple: (u32, u32, u32) = (0, 0, 0);
174        my_tuple.apply(&dynamic_tuple);
175        assert_eq!(my_tuple, (1, 2, 3));
176    }
177
178    // 2. `DynamicArray`
179    {
180        let dynamic_array = DynamicArray::from_iter([1u32, 2u32, 3u32]);
181
182        let mut my_array = [0u32; 3];
183        my_array.apply(&dynamic_array);
184        assert_eq!(my_array, [1, 2, 3]);
185    }
186
187    // 3. `DynamicList`
188    {
189        let dynamic_list = DynamicList::from_iter([1u32, 2u32, 3u32]);
190
191        let mut my_list: Vec<u32> = Vec::new();
192        my_list.apply(&dynamic_list);
193        assert_eq!(my_list, vec![1, 2, 3]);
194    }
195
196    // 4. `DynamicSet`
197    {
198        let mut dynamic_set = DynamicSet::from_iter(["x", "y", "z"]);
199        assert!(dynamic_set.contains(&"x"));
200
201        dynamic_set.remove(&"y");
202
203        let mut my_set: HashSet<&str> = HashSet::default();
204        my_set.apply(&dynamic_set);
205        assert_eq!(my_set, HashSet::from_iter(["x", "z"]));
206    }
207
208    // 5. `DynamicMap`
209    {
210        let dynamic_map = DynamicMap::from_iter([("x", 1u32), ("y", 2u32), ("z", 3u32)]);
211
212        let mut my_map: HashMap<&str, u32> = HashMap::default();
213        my_map.apply(&dynamic_map);
214        assert_eq!(my_map.get("x"), Some(&1));
215        assert_eq!(my_map.get("y"), Some(&2));
216        assert_eq!(my_map.get("z"), Some(&3));
217    }
218
219    // 6. `DynamicStruct`
220    {
221        #[derive(Reflect, Default, Debug, PartialEq)]
222        struct MyStruct {
223            x: u32,
224            y: u32,
225            z: u32,
226        }
227
228        let mut dynamic_struct = DynamicStruct::default();
229        dynamic_struct.insert("x", 1u32);
230        dynamic_struct.insert("y", 2u32);
231        dynamic_struct.insert("z", 3u32);
232
233        let mut my_struct = MyStruct::default();
234        my_struct.apply(&dynamic_struct);
235        assert_eq!(my_struct, MyStruct { x: 1, y: 2, z: 3 });
236    }
237
238    // 7. `DynamicTupleStruct`
239    {
240        #[derive(Reflect, Default, Debug, PartialEq)]
241        struct MyTupleStruct(u32, u32, u32);
242
243        let mut dynamic_tuple_struct = DynamicTupleStruct::default();
244        dynamic_tuple_struct.insert(1u32);
245        dynamic_tuple_struct.insert(2u32);
246        dynamic_tuple_struct.insert(3u32);
247
248        let mut my_tuple_struct = MyTupleStruct::default();
249        my_tuple_struct.apply(&dynamic_tuple_struct);
250        assert_eq!(my_tuple_struct, MyTupleStruct(1, 2, 3));
251    }
252
253    // 8. `DynamicEnum`
254    {
255        #[derive(Reflect, Default, Debug, PartialEq)]
256        enum MyEnum {
257            #[default]
258            Empty,
259            Xyz(u32, u32, u32),
260        }
261
262        let mut values = DynamicTuple::default();
263        values.insert(1u32);
264        values.insert(2u32);
265        values.insert(3u32);
266
267        let dynamic_variant = DynamicVariant::Tuple(values);
268        let dynamic_enum = DynamicEnum::new("Xyz", dynamic_variant);
269
270        let mut my_enum = MyEnum::default();
271        my_enum.apply(&dynamic_enum);
272        assert_eq!(my_enum, MyEnum::Xyz(1, 2, 3));
273    }
274}

Trait Implementations§

Source§

impl Clone for ReflectFromReflect

Source§

fn clone(&self) -> ReflectFromReflect

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<T> FromType<T> for ReflectFromReflect
where T: FromReflect,

Source§

fn from_type() -> ReflectFromReflect

Creates an instance of Self for type T.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T, U> AsBindGroupShaderType<U> for T
where U: ShaderType, &'a T: for<'a> Into<U>,

Source§

fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U

Return the T ShaderType for self. When used in AsBindGroup derives, it is safe to assume that all images in self exist.
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Converts Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Converts &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Converts &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> DowncastSend for T
where T: Any + Send,

Source§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<S> FromSample<S> for S

Source§

fn from_sample_(s: S) -> S

Source§

impl<T, W> HasTypeWitness<W> for T
where W: MakeTypeWitness<Arg = T>, T: ?Sized,

Source§

const WITNESS: W = W::MAKE

A constant of the type witness
Source§

impl<T> Identity for T
where T: ?Sized,

Source§

const TYPE_EQ: TypeEq<T, <T as Identity>::Type> = TypeEq::NEW

Proof that Self is the same type as Self::Type, provides methods for casting between Self and Self::Type.
Source§

type Type = T

The same type as Self, used to emulate type equality bounds (T == U) with associated type equality constraints (T: Identity<Type = U>).
Source§

impl<T> InitializeFromFunction<T> for T

Source§

fn initialize_from_function(f: fn() -> T) -> T

Create an instance of this type from an initialization function
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> IntoResult<T> for T

Source§

fn into_result(self) -> Result<T, RunSystemError>

Converts this type into the system output type.
Source§

impl<F, T> IntoSample<T> for F
where T: FromSample<F>,

Source§

fn into_sample(self) -> T

Source§

impl<A> Is for A
where A: Any,

Source§

fn is<T>() -> bool
where T: Any,

Checks if the current type “is” another type, using a TypeId equality comparison. This is most useful in the context of generic logic. Read more
Source§

impl<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
Source§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
Source§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<Ret> SpawnIfAsync<(), Ret> for Ret

Source§

fn spawn(self) -> Ret

Spawn the value into the dioxus runtime if it is an async block
Source§

impl<T, O> SuperFrom<T> for O
where O: From<T>,

Source§

fn super_from(input: T) -> O

Convert from a type to another type.
Source§

impl<T, O, M> SuperInto<O, M> for T
where O: SuperFrom<T, M>,

Source§

fn super_into(self) -> O

Convert from a type to another type.
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> ToSample<U> for T
where U: FromSample<T>,

Source§

fn to_sample_(self) -> U

Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> TypeData for T
where T: 'static + Send + Sync + Clone,

Source§

fn clone_type_data(&self) -> Box<dyn TypeData>

Creates a type-erased clone of this value.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> ConditionalSend for T
where T: Send,

Source§

impl<S, T> Duplex<S> for T
where T: FromSample<S> + ToSample<S>,

Source§

impl<T> Settings for T
where T: 'static + Send + Sync,

Source§

impl<T> WasmNotSend for T
where T: Send,

Source§

impl<T> WasmNotSendSync for T

Source§

impl<T> WasmNotSync for T
where T: Sync,