diff --git a/Chapter04/Cargo.toml b/Chapter04/Cargo.toml new file mode 100644 index 0000000..d935a84 --- /dev/null +++ b/Chapter04/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "Chapter4" +version = "1.0.0" + +[dependencies] + +[[bin]] +name = "generics" +path = "generics.rs" + +[[bin]] +name = "polymorphism" +path = "polymorphism.rs" diff --git a/Chapter04/generics.rs b/Chapter04/generics.rs new file mode 100644 index 0000000..46f05b8 --- /dev/null +++ b/Chapter04/generics.rs @@ -0,0 +1,86 @@ +struct Cat +{ + weight: f64, + speed: f64 +} + +struct Dog +{ + weight: f64, + speed: f64 +} + +trait Animal +{ + fn max_speed(&self) -> f64; +} + +impl Animal for Cat +{ + fn max_speed(&self) -> f64 + { + self.speed + } +} + +impl Animal for Dog +{ + fn max_speed(&self) -> f64 + { + self.speed + } +} + +struct SqueakyToy +{ + weight: f64 +} + +struct Stick +{ + weight: f64 +} + +trait Toy +{ + fn weight(&self) -> f64; +} + +impl Toy for SqueakyToy +{ + fn weight(&self) -> f64 + { + self.weight + } +} + +impl Toy for Stick +{ + fn weight(&self) -> f64 + { + self.weight + } +} + +struct AnimalChasingToy +{ + animal: A, + toy: T +} + +trait AnimalChasesToy +{ + fn chase(&self); +} + +impl AnimalChasesToy for AnimalChasingToy +{ + fn chase(&self) + { + println!("chase") + } +} + +fn main() +{ +} diff --git a/Chapter04/polymorphism.rs b/Chapter04/polymorphism.rs new file mode 100644 index 0000000..fe0c7d1 --- /dev/null +++ b/Chapter04/polymorphism.rs @@ -0,0 +1,43 @@ +use std::ops::Mul; + +fn raise_by_three(x: T) -> T +where T: std::ops::Mul +{ + x * x * x +} + +#[derive(Copy, Clone)] +struct Raiseable +{ + x: T +} +impl std::ops::Mul for Raiseable +where T: std::ops::Mul +{ + type Output = Raiseable; + fn mul(self, rhs: Self) -> Self::Output + { + Raiseable { x: self.x * rhs.x } + } +} + +fn main() +{ + + raise_by_three(10); + (10 as u64).pow(3); + + raise_by_three(3.0); + (3.0 as f64).powi(3); + + let x = Raiseable { x: 10 as u64 }; + raise_by_three(x); + //no method named pow + //x.pow(3); + + let x = Raiseable { x: 3.0 as f64 }; + raise_by_three(x); + //no method named powi + //x.powi(3); + +}