TIL about
std::any
.Congrats on another release! I’ll try it out this weekend. :)
std::any
is pretty cool. You can use it, for example, to build a map where the key is just the type of the value.So, you could query it like this:
let maybe_position = store.find::<Position>(id);
The
id
is the ID of anentity
which may or may not have aPosition
associated with it.This is similar to just using structs/OOP, so where you’d have a
Vec<Entity>
and then you’d callentity.position
, but the big difference lies in flexibility. AnEntity
type would need to have all fields defined, which may ever exist on an entity.
With this type-as-key map approach, you can just tack on new attributes to entities and dynamically react to them.All of this is basically how the storage works in the Entity-Component-System architecture (ECS), which is popular in gamedev, for example. But both the storage method and the ECS architecture are good tools to be aware of in normal software design, too.
Yeah, I thought of runtime duck typing when I saw it, which is essentially what an ECS is.
It would be pretty cool to go the next step and be able to find and call methods or discover trait implementations on the type that may not be in the signature. So something like how Go can conditionally type asset an interface to a different interface. I don’t know if that’s possible in a zero cost way (probably not), but it would be interesting.
So rust finally gets reflection? In stable no less!
Well, if the only thing you need from reflection is the name of a type, so then yes. But I wouldn’t really call this reflection since it is very limited.
Yeah, Rust can’t have proper reflection, since there’s no external runtime environment that keeps track of your state. Any such smartness either has to be compiled-in (which is how
std::any
and macros work) or you can implement something to keep track of this state at runtime, as if you were partially building a runtime environment.Minor point of clarification: it can’t have runtime reflection, but in principle it could have compile time reflection.
And compile-time reflection will probably also continue to suck due to some irreconcilable limitations of type-safe generic specialization. Oh how I would love an equivalent to C++ template parameter packs…