Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use std::rc::Rc;
- use std::any::Any;
- trait Avatar: Any {
- fn draw(&self);
- fn as_any(self: Rc<Self>) -> Rc<dyn Any>;
- }
- struct PointAvatar {
- x: i32,
- y: i32,
- }
- impl Avatar for PointAvatar {
- fn draw(&self) {}
- fn as_any(self: Rc<Self>) -> Rc<dyn Any> {
- self
- }
- }
- struct APIData {
- root: Rc<dyn Avatar>,
- }
- fn init_api(avatar: Rc<dyn Avatar>) -> APIData {
- APIData {root: avatar}
- }
- fn api_draw(api: &APIData) {
- api.root.draw();
- }
- fn main() {
- let avatar: Rc<dyn Avatar> = Rc::new(PointAvatar {x: 0, y: 0});
- let api = init_api(Rc::clone(&avatar));
- // these two lines would happen every frame or something
- let avatar = avatar.as_any().downcast::<PointAvatar>().unwrap();
- avatar.x += 1;
- api_draw(&api);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement