use std::slice::IterMut; pub trait Explainable { fn do_explain(&self)-> String; } pub trait HasAccount { fn get_account(&self)-> String; fn change_account(&mut self, new_value: &str); } pub struct Person { name: String, account: String } impl Explainable for Person { fn do_explain(&self)-> String { return self.name.clone() + " " + self.account.as_str() } } impl HasAccount for Person { fn change_account(&mut self, new_value: &str) { self.account = new_value.to_string(); } fn get_account(&self)-> String { return self.account.clone(); } } fn change_accounts(persons: IterMut<Person>) { for p in persons { println!("Changing person: {}", p.name); let new_str= p.account.clone() + "_020"; p.change_account(&new_str); } } fn main() { println!("Hello, world!"); let mut persons = vec![ Person { name: "Jan".to_string(), account: "2345234".to_string() }, Person { name: "Kees".to_string(), account: "342523".to_string() } ]; // let mut fp = persons.first_mut().unwrap(); // fp.change_account("abcdefg"); for p in persons.iter() { // <- use .iter() here to allow multiple loops let s = p.do_explain(); println!("{}", s); } for p in persons.iter_mut() { let new_str= p.account.clone() + "_010"; p.change_account(&new_str); } change_accounts(persons.iter_mut()); change_accounts(persons.iter_mut()); for p in persons.iter() { let s = p.do_explain(); println!("{}", s); } println!("Finished"); }
955800cookie-checkRust Mutable Iterator example