9.7 Getters and Setters
Methods can provide controlled access (getters) or validated modification (setters) for fields, especially private ones.
pub struct Circle { // Assume this is in a library module radius: f64, // Private field } impl Circle { // Public constructor (associated function) pub fn new(radius: f64) -> Option<Self> { if radius >= 0.0 { Some(Circle { radius }) } else { None } } // Public getter pub fn radius(&self) -> f64 { self.radius } // Public setter with validation pub fn set_radius(&mut self, new_radius: f64) -> Result<(), &'static str> { if new_radius >= 0.0 { self.radius = new_radius; Ok(()) } else { Err("Radius cannot be negative") } } // Calculated property (getter-like) pub fn diameter(&self) -> f64 { self.radius * 2.0 } } fn main() { let mut c = Circle::new(10.0).expect("Creation failed"); println!("Radius: {}", c.radius()); // Use getter println!("Diameter: {}", c.diameter()); if let Err(e) = c.set_radius(-5.0) { // Use setter println!("Error setting radius: {}", e); } let _ = c.set_radius(15.0); println!("New radius: {}", c.radius()); }
While direct public field access is common within the same module for simple cases, getters/setters are crucial for enforcing invariants and defining stable public APIs across modules.