-
Open the Cargo.toml file that has been generated earlier for you.
-
In the bin folder, create a file called return_abstract.rs.
-
Add the following code, and run it with cargo run --bin return_abstract:
1 #![feature(conservative_impl_trait)] 2 3 trait Animal { 4 fn do_sound(&self); 5 } 6 7 struct Dog; 8 impl Animal for Dog { 9 fn do_sound(&self) { 10 println!("Woof"); 11 } 12 } 13 14 fn main() { 15 // The caller doesn't know which exact object he gets 16 // He knows only that it implements the Animal trait 17 let animal = create_animal(); 18 animal.do_sound(); 19 20 for word in caps_words_iter("do you feel lucky, punkā½") { 21 println!("{}", word); 22 } 23 24 let multiplier = create_multiplier(23); 25 let result = multiplier(3); 26 println!("23 * 3 = {}", result); 27 } 28 29 // The impl trait syntax allows us to use abstract return types 30 // This means that we don't specify which exact struct we return 31 // but which trait(s) it implements 32 fn create_animal() -> impl Animal { 33 Dog {} 34 } 35 36 // Any iterator can be returned as an abstract return type 37 fn caps_words_iter<'a>(text: &'a str) -> impl Iterator + 'a { 38 // Return an iterator over every word converted into ALL_CAPS 39 text.trim().split(' ').map(|word| word.to_uppercase()) 40 } 41 42 // Same goes for closures 43 fn create_multiplier(a: i32) -> impl Fn(i32) -> i32 { 44 move |b| a * b 45 }