-
-use std::any::{Any,TypeId};
+use std::any::{Any, TypeId};
use std::sync::Arc;
-use downcast_rs::{Downcast, DowncastSync, impl_downcast};
+use downcast_rs::{impl_downcast, Downcast, DowncastSync};
pub trait HasPseudoMethods: DowncastSync {
fn get_caster(&self, tp: TypeId) -> Option<&'static dyn Any>;
struct Frog;
impl HasFeet for Frog {
- fn how_many_feet(&self) -> usize { 4 }
+ fn how_many_feet(&self) -> usize {
+ 4
+ }
}
impl HasPseudoMethods for Frog {
// need a registry of cast-to-trait objects, similar to the existing dispatch
// table. I'm not sure if that's needed.
fn get_caster(&self, tp: TypeId) -> Option<&'static dyn Any> {
- if tp == TypeId::of::<
- &'static dyn HasFeet
- >() {
- static CASTER: fn(&dyn HasPseudoMethods) -> &dyn HasFeet
- = |self_| {
- let self_: &dyn Any = Downcast::as_any(self_);
- let self_: &Frog = self_.downcast_ref().unwrap();
- let self_: &dyn HasFeet = self_ as _;
- self_
- };
-
- return Some(&CASTER);
- }
- None
+ if tp == TypeId::of::<&'static dyn HasFeet>() {
+ static CASTER: fn(&dyn HasPseudoMethods) -> &dyn HasFeet = |self_| {
+ let self_: &dyn Any = Downcast::as_any(self_);
+ let self_: &Frog = self_.downcast_ref().unwrap();
+ let self_: &dyn HasFeet = self_ as _;
+ self_
+ };
+
+ return Some(&CASTER);
+ }
+ None
}
}
let erased_frog: Arc<dyn HasPseudoMethods> = frog as _;
let erased_frog: &dyn HasPseudoMethods = &*erased_frog;
- let caster: &'static dyn Any
- = erased_frog.get_caster(TypeId::of::<&'static dyn HasFeet>()).unwrap();
+ let caster: &'static dyn Any = erased_frog
+ .get_caster(TypeId::of::<&'static dyn HasFeet>())
+ .unwrap();
- let caster: &'static fn(&dyn HasPseudoMethods) -> &dyn HasFeet
- = caster.downcast_ref().unwrap();
+ let caster: &'static fn(&dyn HasPseudoMethods) -> &dyn HasFeet = caster.downcast_ref().unwrap();
let with_feet: &dyn HasFeet = caster(erased_frog);
-
- println!("A frog has {} feet and eats .",
- with_feet.how_many_feet(),/*
- eats_food.favorite_food()*/)
+
+ println!(
+ "A frog has {} feet and eats .",
+ with_feet.how_many_feet(), /*
+ eats_food.favorite_food()*/
+ )
}