use std::any::Any; trait Foo: Any { fn as_any(&self) -> &dyn Any; } impl Foo for T { fn as_any(&self) -> &dyn Any { self } } struct Bar { name: String } struct Baz { other_name: String } impl PartialEq for dyn Foo { fn eq(&self, other: &dyn Foo) -> bool { let me = self.as_any(); let you = other.as_any(); if me.is::() && you.is::() { true } else if me.is::() && you.is::() { true } else { false } } } #[test] pub fn test_dyn_any() { let bar: Bar = Bar { name: "Bar".to_string() }; let baz: Baz = Baz { other_name: "Baz".to_string()}; let foo1: &dyn Foo = &bar; let foo2: &dyn Foo = &baz; println!("{:?}", foo1 == foo2); let x = vec!["A", "B"]; for y in x { println!("{}", y) } let vector = vec![foo1, foo2]; for z in vector { let w = z.as_any(); if w.is::() { let x = w.downcast_ref::().unwrap(); println!("Bar name is {}", x.name); } else { let y = w.downcast_ref::().unwrap(); println!("Baz name is {}", y.other_name); } } }