diff --git a/formatting.rs b/formatting.rs new file mode 100644 index 0000000..df9f676 --- /dev/null +++ b/formatting.rs @@ -0,0 +1,52 @@ +use std::fmt::{self, Formatter, Display}; + +struct City{ + name: &'static str, + //Latitude + lat: f32, + //Longitude + lon: f32, +} +impl Display for City{ + //`f` is a buffer, and this method must write the formatted string into it + fn fmt(&self, f: &mut Formatter) -> fmt::Result{ + let lat_c = if self.lat >= 0.0 { 'N' } else { 'S' }; + let lon_c = if self.lon >= 0.0 { 'E' } else { 'W' }; + + //`write!` is like `format!`, but it will write the formatted string + //into a buffer (the first argument) + write!(f, "{}: {:.3}°{} {:.3}°{}", self.name, self.lat.abs(), lat_c, self.lon.abs(), lon_c) + } +} + +#[derive(Debug)] +struct Color{ + red: u8, + green: u8, + blue: u8, +} +impl Display for Color{ + fn fmt(&self, f: &mut Formatter) -> fmt::Result{ + write!(f, "RGB ({0}, {1}, {2}) 0x{0:0width$X}{1:0width$X}{2:0width$X}", self.red, self.green, self.blue, width = 2) + } +} + +fn main(){ + for city in[ + City{ name: "Dublin", lat: 53.347778, lon: -6.259722 }, + City{ name: "Oslo", lat: 59.95, lon: 10.75 }, + City{ name: "Vancouver", lat: 49.25, lon: -123.1 }, + ].iter(){ + println!("{}", *city); + } + for color in[ + Color { red: 128, green: 255, blue: 90 }, + Color { red: 0, green: 3, blue: 254 }, + Color { red: 0, green: 0, blue: 0 }, + ].iter(){ + //Switch this to use {} once you've added an implementation + //for fmt::Display. + //println!("{:?}", *color); + println!("{}", *color); + } +}