}
}
+
+fn cast1(inp: &dyn HasPseudoMethods) -> Option<&dyn HasFeet> {
+ dbg!(std::any::type_name::<&'static dyn HasFeet>());
+ let caster: &'static dyn Any = inp.get_caster(TypeId::of::<&'static dyn HasFeet>())?;
+ let caster: &'static fn (&dyn HasPseudoMethods) -> &dyn HasFeet = caster.downcast_ref().unwrap();
+ let with_feet = caster(inp);
+ Some(with_feet)
+}
+
+
+fn cast2<T:?Sized+'static>(inp: &dyn HasPseudoMethods) -> Option<&T> {
+ dbg!(std::any::type_name::<&'static T>());
+ let caster: &'static dyn Any = inp.get_caster(TypeId::of::<&'static T>())?;
+ let caster: &'static fn (&dyn HasPseudoMethods) -> &T = caster.downcast_ref().unwrap();
+ let with_feet = caster(inp);
+ Some(with_feet)
+}
+
+
fn main() {
let frog = Arc::new(Frog);
let erased_frog: Arc<dyn HasPseudoMethods> = frog as _;
+/*
let erased_frog: &dyn HasPseudoMethods = &*erased_frog;
let caster: &'static dyn Any = erased_frog
let caster: &'static fn(&dyn HasPseudoMethods) -> &dyn HasFeet = caster.downcast_ref().unwrap();
let with_feet: &dyn HasFeet = caster(erased_frog);
+*/
+ // THIS WORKS.
+ let with_feet: &dyn HasFeet = cast1(erased_frog.as_ref()).unwrap();
+ // THIS CRASHES.
+ let with_feet: &dyn HasFeet = cast2::<dyn HasFeet>(erased_frog.as_ref()).unwrap();
println!(
"A frog has {} feet and eats .",
eats_food.favorite_food()*/
)
}
+