• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 extern crate downcast;
2 
3 // we need to use downcast::Any instead of std::any::Any
4 use downcast::{downcast, Any};
5 
6 /* Trait */
7 
8 trait Animal: Any {
what_am_i(&self)9     fn what_am_i(&self);
10 }
11 
12 downcast!(dyn Animal);
13 
14 /* Impl */
15 
16 struct Bird;
17 
18 impl Animal for Bird {
what_am_i(&self)19     fn what_am_i(&self){
20         println!("Im a bird!")
21     }
22 }
23 
24 impl Bird {
wash_beak(&self)25     fn wash_beak(&self) {
26         println!("Beak has been washed! What a clean beak!");
27     }
28 }
29 
30 /* Main */
31 
main()32 fn main() {
33     let animal: Box<dyn Animal> = Box::new(Bird);
34     animal.what_am_i();
35     {
36         let bird = animal.downcast_ref::<Bird>().unwrap();
37         bird.wash_beak();
38     }
39     let bird: Box<Bird> = animal.downcast::<Bird>().ok().unwrap();
40     bird.wash_beak();
41 }
42