diff --git a/src/Conversion.rs b/src/Conversion.rs new file mode 100644 index 0000000..d2bad20 --- /dev/null +++ b/src/Conversion.rs @@ -0,0 +1,3 @@ +pub mod FromAndInto; +pub mod TryFromAndTryInto; +pub mod ToAndFromStrings; diff --git a/src/Conversion/FromAndInto.rs b/src/Conversion/FromAndInto.rs new file mode 100644 index 0000000..06486b1 --- /dev/null +++ b/src/Conversion/FromAndInto.rs @@ -0,0 +1,23 @@ +#[derive(Debug)] +struct Number{ + value: i32, +} +impl std::convert::From for Number{ + fn from(item: i32) -> Self{ + Number { value: item } + } +} + +pub fn main(){ + let num = Number::from(30); + println!("My number is {:?}", num); + + let int = 5; + //Try removing the type declaration + let num: Number = int.into(); + println!("My number is {:?}", num); + + let my_str = "hello"; + #[allow(unused_variables)] + let my_string = String::from(my_str); +} diff --git a/src/Conversion/ToAndFromStrings.rs b/src/Conversion/ToAndFromStrings.rs new file mode 100644 index 0000000..f95f089 --- /dev/null +++ b/src/Conversion/ToAndFromStrings.rs @@ -0,0 +1,20 @@ +struct Circle{ + radius: i32 +} + +impl std::fmt::Display for Circle{ + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result{ + write!(f, "Circle of radius {}", self.radius) + } +} + +pub fn main(){ + let circle = Circle { radius: 6 }; + println!("{}", circle.to_string()); + + let parsed: i32 = "5".parse().unwrap(); + let turbo_parsed = "10".parse::().unwrap(); + + let sum = parsed + turbo_parsed; + println!("Sum: {:?}", sum); +} diff --git a/src/Conversion/TryFromAndTryInto.rs b/src/Conversion/TryFromAndTryInto.rs new file mode 100644 index 0000000..f09a26d --- /dev/null +++ b/src/Conversion/TryFromAndTryInto.rs @@ -0,0 +1,28 @@ +use std::convert::TryFrom; +use std::convert::TryInto; + +#[derive(Debug, PartialEq)] +struct EvenNumber(i32); +impl std::convert::TryFrom for EvenNumber{ + type Error = (); + + fn try_from(value: i32) -> Result{ + if value % 2 == 0 { + Ok(EvenNumber(value)) + } else { + Err(()) + } + } +} + +pub fn main(){ + //TryFrom + assert_eq!(EvenNumber::try_from(8), Ok(EvenNumber(8))); + assert_eq!(EvenNumber::try_from(5), Err(())); + + //TryInto + let result: Result = 8i32.try_into(); + assert_eq!(result, Ok(EvenNumber(8))); + let result: Result = 5i32.try_into(); + assert_eq!(result, Err(())); +} diff --git a/src/main.rs b/src/main.rs index 3d40b73..0a9ecf4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,6 +6,7 @@ mod Primitives; mod CustomTypes; mod VariableBindings; mod Types; +mod Conversion; fn main(){ @@ -58,11 +59,19 @@ fn main(){ //5 Types //5.1 Casting - Types::Casting::main(); + //Types::Casting::main(); //5.2 Literals - Types::Literals::main(); + //Types::Literals::main(); //5.3 Inference - Types::Inference::main(); + //Types::Inference::main(); //5.4 Aliasing - Types::Aliasing::main(); + //Types::Aliasing::main(); + + //6 Conversion + //6.1 From and Into + Conversion::FromAndInto::main(); + //6.2 TryFrom and TryInto + Conversion::TryFromAndTryInto::main(); + //6.3 To and From Strings + Conversion::ToAndFromStrings::main(); }