1 // run-pass
2 #![allow(dead_code)]
3 #![allow(unused_mut)]
4 #![allow(non_camel_case_types)]
5 
6 // ignore-freebsd FIXME fails on BSD
7 
8 
9 trait noisy {
speak(&mut self)10   fn speak(&mut self);
11 }
12 
13 struct cat {
14   meows: usize,
15   how_hungry: isize,
16   name: String,
17 }
18 
19 impl noisy for cat {
speak(&mut self)20   fn speak(&mut self) { self.meow(); }
21 }
22 
23 impl cat {
eat(&mut self) -> bool24   pub fn eat(&mut self) -> bool {
25     if self.how_hungry > 0 {
26         println!("OM NOM NOM");
27         self.how_hungry -= 2;
28         return true;
29     }
30     else {
31         println!("Not hungry!");
32         return false;
33     }
34   }
35 }
36 
37 impl cat {
meow(&mut self)38     fn meow(&mut self) {
39       println!("Meow");
40       self.meows += 1;
41       if self.meows % 5 == 0 {
42           self.how_hungry += 1;
43       }
44     }
45 }
46 
cat(in_x : usize, in_y : isize, in_name: String) -> cat47 fn cat(in_x : usize, in_y : isize, in_name: String) -> cat {
48     cat {
49         meows: in_x,
50         how_hungry: in_y,
51         name: in_name
52     }
53 }
54 
55 
main()56 pub fn main() {
57     let mut nyan = cat(0, 2, "nyan".to_string());
58     let mut nyan: &mut dyn noisy = &mut nyan;
59     nyan.speak();
60 }
61