mirror of
https://github.com/bevyengine/bevy
synced 2024-11-10 07:04:33 +00:00
fe852fd0ad
# Objective Label traits such as `ScheduleLabel` currently have a major footgun: the trait is implemented for `Box<dyn ScheduleLabel>`, but the implementation does not function as one would expect since `Box<T>` is considered to be a distinct type from `T`. This is because the behavior of the `ScheduleLabel` trait is specified mainly through blanket implementations, which prevents `Box<dyn ScheduleLabel>` from being properly special-cased. ## Solution Replace the blanket-implemented behavior with a series of methods defined on `ScheduleLabel`. This allows us to fully special-case `Box<dyn ScheduleLabel>` . --- ## Changelog Fixed a bug where boxed label types (such as `Box<dyn ScheduleLabel>`) behaved incorrectly when compared with concretely-typed labels. ## Migration Guide The `ScheduleLabel` trait has been refactored to no longer depend on the traits `std::any::Any`, `bevy_utils::DynEq`, and `bevy_utils::DynHash`. Any manual implementations will need to implement new trait methods in their stead. ```rust impl ScheduleLabel for MyType { // Before: fn dyn_clone(&self) -> Box<dyn ScheduleLabel> { ... } // After: fn dyn_clone(&self) -> Box<dyn ScheduleLabel> { ... } fn as_dyn_eq(&self) -> &dyn DynEq { self } // No, `mut state: &mut` is not a typo. fn dyn_hash(&self, mut state: &mut dyn Hasher) { self.hash(&mut state); // Hashing the TypeId isn't strictly necessary, but it prevents collisions. TypeId::of::<Self>().hash(&mut state); } } ``` |
||
---|---|---|
.. | ||
src | ||
Cargo.toml |