use std::any::Any;
trait Foo: Any {
fn as_any(&self) -> &dyn Any;
}
impl<T: Any> 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::<Bar>() && you.is::<Bar>() {
true
} else if me.is::<Baz>() && you.is::<Baz>() {
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::<Bar>() {
let x = w.downcast_ref::<Bar>().unwrap();
println!("Bar name is {}", x.name);
} else {
let y = w.downcast_ref::<Baz>().unwrap();
println!("Baz name is {}", y.other_name);
}
}
}