| //@ run-pass |
| #![allow(non_camel_case_types)] |
| |
| |
| |
| |
| pub trait plus { |
| fn plus(&self) -> isize; |
| } |
| |
| mod a { |
| use plus; |
| impl plus for usize { fn plus(&self) -> isize { *self as isize + 20 } } |
| } |
| |
| mod b { |
| use plus; |
| impl plus for String { fn plus(&self) -> isize { 200 } } |
| } |
| |
| trait uint_utils { |
| fn str(&self) -> String; |
| fn multi<F>(&self, f: F) where F: FnMut(usize); |
| } |
| |
| impl uint_utils for usize { |
| fn str(&self) -> String { |
| self.to_string() |
| } |
| fn multi<F>(&self, mut f: F) where F: FnMut(usize) { |
| let mut c = 0_usize; |
| while c < *self { f(c); c += 1_usize; } |
| } |
| } |
| |
| trait vec_utils<T> { |
| fn length_(&self, ) -> usize; |
| fn iter_<F>(&self, f: F) where F: FnMut(&T); //~ WARN method `iter_` is never used |
| fn map_<U, F>(&self, f: F) -> Vec<U> where F: FnMut(&T) -> U; |
| } |
| |
| impl<T> vec_utils<T> for Vec<T> { |
| fn length_(&self) -> usize { self.len() } |
| fn iter_<F>(&self, mut f: F) where F: FnMut(&T) { for x in self { f(x); } } |
| fn map_<U, F>(&self, mut f: F) -> Vec<U> where F: FnMut(&T) -> U { |
| let mut r = Vec::new(); |
| for elt in self { |
| r.push(f(elt)); |
| } |
| r |
| } |
| } |
| |
| pub fn main() { |
| assert_eq!(10_usize.plus(), 30); |
| assert_eq!(("hi".to_string()).plus(), 200); |
| |
| assert_eq!((vec![1]).length_().str(), "1".to_string()); |
| let vect = vec![3, 4].map_(|a| *a + 4); |
| assert_eq!(vect[0], 7); |
| let vect = (vec![3, 4]).map_::<usize, _>(|a| *a as usize + 4_usize); |
| assert_eq!(vect[0], 7_usize); |
| let mut x = 0_usize; |
| 10_usize.multi(|_n| x += 2_usize ); |
| assert_eq!(x, 20_usize); |
| } |