// run-pass #![allow(dead_code)] #![allow(non_camel_case_types)] use std::cmp; #[derive(Copy, Clone, Debug)] enum cat_type { tuxedo, tabby, tortoiseshell } impl cmp::PartialEq for cat_type { fn eq(&self, other: &cat_type) -> bool { ((*self) as usize) == ((*other) as usize) } fn ne(&self, other: &cat_type) -> bool { !(*self).eq(other) } } // Very silly -- this just returns the value of the name field // for any isize value that's less than the meows field // ok: T should be in scope when resolving the trait ref for map struct cat { // Yes, you can have negative meows meows : isize, how_hungry : isize, name : T, } impl cat { pub fn speak(&mut self) { self.meow(); } pub fn eat(&mut self) -> bool { if self.how_hungry > 0 { println!("OM NOM NOM"); self.how_hungry -= 2; return true; } else { println!("Not hungry!"); return false; } } fn len(&self) -> usize { self.meows as usize } fn is_empty(&self) -> bool { self.meows == 0 } fn clear(&mut self) {} fn contains_key(&self, k: &isize) -> bool { *k <= self.meows } fn find(&self, k: &isize) -> Option<&T> { if *k <= self.meows { Some(&self.name) } else { None } } fn insert(&mut self, k: isize, _: T) -> bool { self.meows += k; true } fn find_mut(&mut self, _k: &isize) -> Option<&mut T> { panic!() } fn remove(&mut self, k: &isize) -> bool { if self.find(k).is_some() { self.meows -= *k; true } else { false } } fn pop(&mut self, _k: &isize) -> Option { panic!() } fn swap(&mut self, _k: isize, _v: T) -> Option { panic!() } } impl cat { pub fn get(&self, k: &isize) -> &T { match self.find(k) { Some(v) => { v } None => { panic!("epic fail"); } } } pub fn new(in_x: isize, in_y: isize, in_name: T) -> cat { cat{meows: in_x, how_hungry: in_y, name: in_name } } } impl cat { fn meow(&mut self) { self.meows += 1; println!("Meow {}", self.meows); if self.meows % 5 == 0 { self.how_hungry += 1; } } } pub fn main() { let mut nyan: cat = cat::new(0, 2, "nyan".to_string()); for _ in 1_usize..5 { nyan.speak(); } assert_eq!(*nyan.find(&1).unwrap(), "nyan".to_string()); assert_eq!(nyan.find(&10), None); let mut spotty: cat = cat::new(2, 57, cat_type::tuxedo); for _ in 0_usize..6 { spotty.speak(); } assert_eq!(spotty.len(), 8); assert!((spotty.contains_key(&2))); assert_eq!(spotty.get(&3), &cat_type::tuxedo); }