&self = immutable borrow, multiple allowed, read-only. &mut self = mutable borrow, exclusive, read-write. The borrow checker enforces these rules at compile time.
&self — shared read access:
1struct Database {2 records: Vec<String>,3}45impl Database {6 fn count(&self) -> usize {7 self.records.len()8 }910 fn find(&self, query: &str) -> Vec<&str> {11 self.records.iter()12 .filter(|r| r.contains(query))13 .map(|s| s.as_str())14 .collect()15 }16}1718let db = Database { records: vec!["Alice".into(), "Bob".into()] };19println!("Count: {}", db.count()); // 220println!("A: {:?}", db.find("A")); // ["Alice"]
&mut self — exclusive write access:
1impl Database {2 fn add(&mut self, record: String) {3 self.records.push(record);4 }56 fn remove(&mut self, index: usize) -> Option<String> {7 if index < self.records.len() {8 Some(self.records.remove(index))9 } else {10 None11 }12 }13}1415let mut db = Database { records: vec![] };16db.add("New record".into());
When to use &self:
When to use &mut self:
Common mistakes:
let mut for &mut self methods.