Rust Mutable Iterator example

Date: 2025-06-08
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");
}

95580cookie-checkRust Mutable Iterator example