bevy/release-content/migration-guides/map_set_apply.md
Alix Bott dd4479ed30
Fix PartialReflect::apply for maps, remove get_at/_mut from Map trait (#19802)
# Objective

- Fixes https://github.com/bevyengine/bevy/issues/14328
- `DynamicMap::drain` was broken (indices weren't cleared, causing a
panic when reading later)
- `PartialReflect::apply` was broken for maps and sets, because they
don't remove entries from the `self` map that aren't in the applied map.
- I discovered this bug when implementing MapEntities on a Component
containing a `HashMap<Entity, _>`. Because `apply` is used to reapply
the changes to the reflected map, the map ended up littered with a ton
of outdated entries.

## Solution

- Remove the separate `Vec` in `DynamicMap` and use the `HashTable`
directly, like it is in `DynamicSet`.
- Replace `MapIter` by `Box<dyn Iterator>` (like for `DynamicSet`), and
`Map::get_at` and `Map::get_at_mut` which are now unused.
- Now assume `DynamicMap` types are unordered and adjust documentation
accordingly.
- Fix documentation of `DynamicSet` (ordered -> unordered)
- Added `Map::retain` and `Set::retain`, and use them to remove excess
entries in `PartialReflect::apply` implementations.

## Testing

- Added `map::tests::apply` and `set::tests::apply` to validate
`<DynamicMap as PartialReflect>::apply` and `<DynamicSet as
PartialReflect>::apply`
2025-06-25 15:42:01 +00:00

810 B

title: DynamicMap is now unordered, Map::get_at and Map::get_at_mut are now removed, and apply removes excess entries from reflected maps. pull_requests: [19802]

DynamicMap is now unordered, and the Map trait no longer assumes implementors to be ordered. If you previously relied on them being ordered, you should now store a list of keys (Vec<Box<dyn PartialReflect>>) separately.

Map::get_at and Map::get_at_mut are now removed. You should no longer use usize to index into the map, and instead use &dyn PartialReflect with Map::get and Map::get_mut.

PartialReflect::apply(self, other) for maps now removes excess entries (entries present in self which are not present in other). If you need those entries to be preserved, you will need to re-insert them manually.