Trait bevy_reflect::Reflect
source · pub trait Reflect: DynamicTypePath + Any + Send + Sync {
Show 20 methods
// Required methods
fn get_represented_type_info(&self) -> Option<&'static TypeInfo>;
fn into_any(self: Box<Self>) -> Box<dyn Any>;
fn as_any(&self) -> &dyn Any;
fn as_any_mut(&mut self) -> &mut dyn Any;
fn into_reflect(self: Box<Self>) -> Box<dyn Reflect>;
fn as_reflect(&self) -> &dyn Reflect;
fn as_reflect_mut(&mut self) -> &mut dyn Reflect;
fn try_apply(&mut self, value: &dyn Reflect) -> Result<(), ApplyError>;
fn set(&mut self, value: Box<dyn Reflect>) -> Result<(), Box<dyn Reflect>>;
fn reflect_ref(&self) -> ReflectRef<'_>;
fn reflect_mut(&mut self) -> ReflectMut<'_>;
fn reflect_owned(self: Box<Self>) -> ReflectOwned;
fn clone_value(&self) -> Box<dyn Reflect>;
// Provided methods
fn apply(&mut self, value: &dyn Reflect) { ... }
fn reflect_kind(&self) -> ReflectKind { ... }
fn reflect_hash(&self) -> Option<u64> { ... }
fn reflect_partial_eq(&self, _value: &dyn Reflect) -> Option<bool> { ... }
fn debug(&self, f: &mut Formatter<'_>) -> Result { ... }
fn serializable(&self) -> Option<Serializable<'_>> { ... }
fn is_dynamic(&self) -> bool { ... }
}
Expand description
The core trait of bevy_reflect
, used for accessing and modifying data dynamically.
It’s recommended to use the derive macro rather than manually implementing this trait.
Doing so will automatically implement many other useful traits for reflection,
including one of the appropriate subtraits: Struct
, TupleStruct
or Enum
.
See the crate-level documentation to see how this trait and its subtraits can be used.
Required Methods§
sourcefn get_represented_type_info(&self) -> Option<&'static TypeInfo>
fn get_represented_type_info(&self) -> Option<&'static TypeInfo>
Returns the TypeInfo
of the type represented by this value.
For most types, this will simply return their own TypeInfo
.
However, for dynamic types, such as DynamicStruct
or DynamicList
,
this will return the type they represent
(or None
if they don’t represent any particular type).
This method is great if you have an instance of a type or a dyn Reflect
,
and want to access its TypeInfo
. However, if this method is to be called
frequently, consider using TypeRegistry::get_type_info
as it can be more
performant for such use cases.
sourcefn as_any_mut(&mut self) -> &mut dyn Any
fn as_any_mut(&mut self) -> &mut dyn Any
Returns the value as a &mut dyn Any
.
sourcefn into_reflect(self: Box<Self>) -> Box<dyn Reflect>
fn into_reflect(self: Box<Self>) -> Box<dyn Reflect>
Casts this type to a boxed reflected value.
sourcefn as_reflect(&self) -> &dyn Reflect
fn as_reflect(&self) -> &dyn Reflect
Casts this type to a reflected value.
sourcefn as_reflect_mut(&mut self) -> &mut dyn Reflect
fn as_reflect_mut(&mut self) -> &mut dyn Reflect
Casts this type to a mutable reflected value.
sourcefn try_apply(&mut self, value: &dyn Reflect) -> Result<(), ApplyError>
fn try_apply(&mut self, value: &dyn Reflect) -> Result<(), ApplyError>
Tries to apply
a reflected value to this value.
Functions the same as the apply
function but returns an error instead of
panicking.
§Handling Errors
This function may leave self
in a partially mutated state if a error was encountered on the way.
consider maintaining a cloned instance of this data you can switch to if a error is encountered.
sourcefn set(&mut self, value: Box<dyn Reflect>) -> Result<(), Box<dyn Reflect>>
fn set(&mut self, value: Box<dyn Reflect>) -> Result<(), Box<dyn Reflect>>
Performs a type-checked assignment of a reflected value to this value.
If value
does not contain a value of type T
, returns an Err
containing the trait object.
sourcefn reflect_ref(&self) -> ReflectRef<'_>
fn reflect_ref(&self) -> ReflectRef<'_>
Returns an immutable enumeration of “kinds” of type.
See ReflectRef
.
sourcefn reflect_mut(&mut self) -> ReflectMut<'_>
fn reflect_mut(&mut self) -> ReflectMut<'_>
Returns a mutable enumeration of “kinds” of type.
See ReflectMut
.
sourcefn reflect_owned(self: Box<Self>) -> ReflectOwned
fn reflect_owned(self: Box<Self>) -> ReflectOwned
Returns an owned enumeration of “kinds” of type.
See ReflectOwned
.
sourcefn clone_value(&self) -> Box<dyn Reflect>
fn clone_value(&self) -> Box<dyn Reflect>
Clones the value as a Reflect
trait object.
When deriving Reflect
for a struct, tuple struct or enum, the value is
cloned via Struct::clone_dynamic
, TupleStruct::clone_dynamic
,
or Enum::clone_dynamic
, respectively.
Implementors of other Reflect
subtraits (e.g. List
, Map
) should
use those subtraits’ respective clone_dynamic
methods.
Provided Methods§
sourcefn apply(&mut self, value: &dyn Reflect)
fn apply(&mut self, value: &dyn Reflect)
Applies a reflected value to this value.
If a type implements a subtrait of Reflect
, then the semantics of this
method are as follows:
- If
T
is aStruct
, then the value of each named field ofvalue
is applied to the corresponding named field ofself
. Fields which are not present in both structs are ignored. - If
T
is aTupleStruct
orTuple
, then the value of each numbered field is applied to the corresponding numbered field ofself.
Fields which are not present in both values are ignored. - If
T
is anEnum
, then the variant ofself
isupdated
to match the variant ofvalue
. The corresponding fields of that variant are applied fromvalue
ontoself
. Fields which are not present in both values are ignored. - If
T
is aList
orArray
, then each element ofvalue
is applied to the corresponding element ofself
. Up toself.len()
items are applied, and excess elements invalue
are appended toself
. - If
T
is aMap
, then for each key invalue
, the associated value is applied to the value associated with the same key inself
. Keys which are not present inself
are inserted. - If
T
is none of these, thenvalue
is downcast toT
, cloned, and assigned toself
.
Note that Reflect
must be implemented manually for List
s and
Map
s in order to achieve the correct semantics, as derived
implementations will have the semantics for Struct
, TupleStruct
, Enum
or none of the above depending on the kind of type. For lists and maps, use the
list_apply
and map_apply
helper functions when implementing this method.
§Panics
Derived implementations of this method will panic:
- If the type of
value
is not of the same kind asT
(e.g. ifT
is aList
, whilevalue
is aStruct
). - If
T
is any complex type and the corresponding fields or elements ofself
andvalue
are not of the same type. - If
T
is a value type andself
cannot be downcast toT
sourcefn reflect_kind(&self) -> ReflectKind
fn reflect_kind(&self) -> ReflectKind
Returns a zero-sized enumeration of “kinds” of type.
See ReflectKind
.
sourcefn reflect_hash(&self) -> Option<u64>
fn reflect_hash(&self) -> Option<u64>
Returns a hash of the value (which includes the type).
If the underlying type does not support hashing, returns None
.
sourcefn reflect_partial_eq(&self, _value: &dyn Reflect) -> Option<bool>
fn reflect_partial_eq(&self, _value: &dyn Reflect) -> Option<bool>
Returns a “partial equality” comparison result.
If the underlying type does not support equality testing, returns None
.
sourcefn serializable(&self) -> Option<Serializable<'_>>
fn serializable(&self) -> Option<Serializable<'_>>
Returns a serializable version of the value.
If the underlying type does not support serialization, returns None
.
sourcefn is_dynamic(&self) -> bool
fn is_dynamic(&self) -> bool
Indicates whether or not this type is a dynamic type.
Dynamic types include the ones built-in to this crate,
such as DynamicStruct
, DynamicList
, and DynamicTuple
.
However, they may be custom types used as proxies for other types
or to facilitate scripting capabilities.
By default, this method will return false
.
Implementations§
source§impl dyn Reflect
impl dyn Reflect
sourcepub fn downcast<T: Reflect>(
self: Box<dyn Reflect>
) -> Result<Box<T>, Box<dyn Reflect>>
pub fn downcast<T: Reflect>( self: Box<dyn Reflect> ) -> Result<Box<T>, Box<dyn Reflect>>
Downcasts the value to type T
, consuming the trait object.
If the underlying value is not of type T
, returns Err(self)
.
sourcepub fn take<T: Reflect>(self: Box<dyn Reflect>) -> Result<T, Box<dyn Reflect>>
pub fn take<T: Reflect>(self: Box<dyn Reflect>) -> Result<T, Box<dyn Reflect>>
Downcasts the value to type T
, unboxing and consuming the trait object.
If the underlying value is not of type T
, returns Err(self)
.
sourcepub fn represents<T: Reflect + TypePath>(&self) -> bool
pub fn represents<T: Reflect + TypePath>(&self) -> bool
Returns true
if the underlying value represents a value of type T
, or false
otherwise.
Read is
for more information on underlying values and represented types.
sourcepub fn is<T: Reflect>(&self) -> bool
pub fn is<T: Reflect>(&self) -> bool
Returns true
if the underlying value is of type T
, or false
otherwise.
The underlying value is the concrete type that is stored in this dyn
object;
it can be downcasted to. In the case that this underlying value “represents”
a different type, like the Dynamic*** types do, you can call represents
to determine what type they represent. Represented types cannot be downcasted
to, but you can use FromReflect
to create a value of the represented type from them.
sourcepub fn downcast_ref<T: Reflect>(&self) -> Option<&T>
pub fn downcast_ref<T: Reflect>(&self) -> Option<&T>
Downcasts the value to type T
by reference.
If the underlying value is not of type T
, returns None
.
sourcepub fn downcast_mut<T: Reflect>(&mut self) -> Option<&mut T>
pub fn downcast_mut<T: Reflect>(&mut self) -> Option<&mut T>
Downcasts the value to type T
by mutable reference.
If the underlying value is not of type T
, returns None
.