this post was submitted on 16 Oct 2024
65 points (97.1% liked)
Rust
6005 readers
5 users here now
Welcome to the Rust community! This is a place to discuss about the Rust programming language.
Wormhole
Credits
- The icon is a modified version of the official rust logo (changing the colors to a gradient and black background)
founded 1 year ago
MODERATORS
you are viewing a single comment's thread
view the rest of the comments
view the rest of the comments
A cool thing you can do, is to store values of all kinds of types in a big HashMap, basically by storing their
TypeId
and casting them toBox<dyn Any>
(see std::any).Then you can later retrieve those values by specifying the type (and optionally another ID for storing multiple values of the same type).
So, you can create an API which is used like this:
There's various ECS storage libraries which also implement such an API. Depending on what you're doing, you might prefer to use those rather than implementing it yourself, but it's not too difficult to implement yourself.
There's a crate for it too: anymap2
What if I specify the wrong type?
let retrieved = storage.get::<SomeOtherType>();
?Is it a runtime error or a compile time error?
To answer my own question: I believe it's a runtime error: https://doc.rust-lang.org/stable/std/any/trait.Any.html#method.downcast
Well, you would determine the
TypeId
ofSomeOtherType
, then search for that as the key in your HashMap and get back aNone
, because no entry exists and then you'd hand that back to the user.I guess, my little usage example should've included handling of an
Option
value...So, it's only a runtime error, if you decide to
.unwrap()
or similar.