diff options
Diffstat (limited to 'rust-book/oop/src')
-rwxr-xr-x | rust-book/oop/src/lib.rs | 41 | ||||
-rwxr-xr-x | rust-book/oop/src/main.rs | 56 |
2 files changed, 97 insertions, 0 deletions
diff --git a/rust-book/oop/src/lib.rs b/rust-book/oop/src/lib.rs new file mode 100755 index 0000000..91ef2e8 --- /dev/null +++ b/rust-book/oop/src/lib.rs @@ -0,0 +1,41 @@ +pub trait Draw { + fn draw(&self); +} + +pub struct Screen { + pub components: Vec<Box<dyn Draw>>, +} + +impl Screen { + pub fn run(&self) { + for component in self.components.iter() { + component.draw(); + } + } +} + +pub struct Button { + pub width: u32, + pub height: u32, + pub label: String, +} + +impl Draw for Button { + fn draw(&self) { + dbg!("drew button"); + } +} + +pub struct SelectBox { + pub width: u32, + pub height: u32, + pub options: Vec<String>, +} + +impl Draw for SelectBox { + fn draw(&self) { + dbg!("drew select box"); + } +} + + diff --git a/rust-book/oop/src/main.rs b/rust-book/oop/src/main.rs new file mode 100755 index 0000000..e92c07c --- /dev/null +++ b/rust-book/oop/src/main.rs @@ -0,0 +1,56 @@ +use oop::{Screen, Button, SelectBox}; + +pub struct AveragedCollection { + list: Vec<i32>, + average: f64, +} + +impl AveragedCollection { + pub fn add(&mut self, value: i32) { + self.list.push(value); + self.update_average(); + } + + pub fn remove(&mut self) -> Option<i32> { + let result = self.list.pop(); + match result { + Some(value) => { + self.update_average(); + Some(value) + }, + None => None, + } + } + + pub fn average(&self) -> f64 { + self.average + } + + fn update_average(&mut self) { + let total: i32 = self.list.iter().sum(); + self.average = total as f64 / self.list.len() as f64; + } +} + +fn main() { + let screen = Screen { + components: vec![ + Box::new(SelectBox { + width: 75, + height: 10, + options: vec![ + String::from("Yes"), + String::from("Maybe"), + String::from("No") + ], + }), + Box::new(Button { + width: 50, + height: 10, + label: String::from("OK"), + }), + ], + }; + + screen.run(); +} |