chiark / gitweb /
Fixed
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 5 Jun 2023 18:05:20 +0000 (19:05 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 5 Jun 2023 18:05:20 +0000 (19:05 +0100)
src/main.rs

index d253eb734240bfe591b16e5fe15432ed46d1f8ef..959fa1bbeaf5e78c2f0c387e209779b489b579c1 100644 (file)
@@ -8,7 +8,7 @@ pub trait HasPseudoMethods: DowncastSync {
 }
 impl_downcast!(sync HasPseudoMethods);
 
-trait HasFeet {
+trait HasFeet: 'static {
     fn how_many_feet(&self) -> usize;
 }
 
@@ -52,7 +52,27 @@ fn cast1(inp: &dyn HasPseudoMethods) -> Option<&dyn HasFeet> {
 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 caster_f: &'static fn (&dyn HasPseudoMethods) -> &dyn HasFeet = caster.downcast_ref().unwrap();
+    dbg!(caster, caster_f);
+
+    dbg!(
+        TypeId::of::<dyn HasFeet>(),
+        TypeId::of::<
+fn (&dyn HasPseudoMethods) -> &(dyn HasFeet + 'static)
+         >());
+    dbg!(
+        TypeId::of::<T>(),
+        TypeId::of::<
+fn (&dyn HasPseudoMethods) -> &T
+         >());
+
+   let caster: &'static fn (&dyn HasPseudoMethods) -> &T =
+        caster.downcast_ref
+//::<
+//            for <'x> fn (&'x dyn HasPseudoMethods) -> &'x T
+//                >
+().unwrap();
    let with_feet = caster(inp);
    Some(with_feet)
 }