chiark / gitweb /
broken from pad
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 5 Jun 2023 17:53:13 +0000 (18:53 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 5 Jun 2023 17:53:13 +0000 (18:53 +0100)
src/main.rs

index beb677cd1e7d1bf7cd3e6a7686c63bf1e2b93508..d253eb734240bfe591b16e5fe15432ed46d1f8ef 100644 (file)
@@ -39,9 +39,29 @@ impl HasPseudoMethods for Frog {
     }
 }
 
+
+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
@@ -51,6 +71,11 @@ fn main() {
     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 .",
@@ -58,3 +83,4 @@ fn main() {
                                    eats_food.favorite_food()*/
     )
 }
+