diff options
| author | Hunter Kvalevog <hunter@kvog.sh> | 2026-09-19 17:44:02 -0500 |
|---|---|---|
| committer | Hunter Kvalevog <hunter@kvog.sh> | 2026-09-19 17:44:02 -0500 |
| commit | 13c7b05a26b78cb63bed5d2afdf8eb927197286e (patch) | |
| tree | 29ae22718398ef3c1d605ea8725ebbac9c8b4ac3 | |
| parent | 4791a7ab0400713568f8c9594d9ac2bac10cd8ae (diff) | |
rustlings: complete 07
| -rw-r--r-- | rustlings/.rustlings-state.txt | 20 | ||||
| -rw-r--r-- | rustlings/exercises/07_structs/structs1.rs | 21 | ||||
| -rw-r--r-- | rustlings/exercises/07_structs/structs2.rs | 7 | ||||
| -rw-r--r-- | rustlings/exercises/07_structs/structs3.rs | 11 | ||||
| -rw-r--r-- | rustlings/solutions/07_structs/structs1.rs | 49 | ||||
| -rw-r--r-- | rustlings/solutions/07_structs/structs2.rs | 51 | ||||
| -rw-r--r-- | rustlings/solutions/07_structs/structs3.rs | 83 |
7 files changed, 216 insertions, 26 deletions
diff --git a/rustlings/.rustlings-state.txt b/rustlings/.rustlings-state.txt index 1edd88f..493b27f 100644 --- a/rustlings/.rustlings-state.txt +++ b/rustlings/.rustlings-state.txt @@ -1,6 +1,6 @@ DON'T EDIT THIS FILE! -primitive_types1 +enums1 intro1 intro2 @@ -18,4 +18,20 @@ functions5 if1 if2 if3 -quiz1
\ No newline at end of file +quiz1 +primitive_types1 +primitive_types2 +primitive_types3 +primitive_types4 +primitive_types5 +primitive_types6 +vecs1 +vecs2 +move_semantics1 +move_semantics2 +move_semantics3 +move_semantics4 +move_semantics5 +structs1 +structs2 +structs3
\ No newline at end of file diff --git a/rustlings/exercises/07_structs/structs1.rs b/rustlings/exercises/07_structs/structs1.rs index 959c4c6..8376a98 100644 --- a/rustlings/exercises/07_structs/structs1.rs +++ b/rustlings/exercises/07_structs/structs1.rs @@ -1,9 +1,10 @@ struct ColorRegularStruct { - // TODO: Add the fields that the test `regular_structs` expects. - // What types should the fields have? What are the minimum and maximum values for RGB colors? + red: u8, + green: u8, + blue: u8, } -struct ColorTupleStruct(/* TODO: Add the fields that the test `tuple_structs` expects */); +struct ColorTupleStruct(u8, u8, u8); #[derive(Debug)] struct UnitStruct; @@ -18,8 +19,11 @@ mod tests { #[test] fn regular_structs() { - // TODO: Instantiate a regular struct. - // let green = + let green = ColorRegularStruct { + red: 0, + green: 255, + blue: 0, + }; assert_eq!(green.red, 0); assert_eq!(green.green, 255); @@ -28,8 +32,7 @@ mod tests { #[test] fn tuple_structs() { - // TODO: Instantiate a tuple struct. - // let green = + let green = ColorTupleStruct(0, 255, 0 ); assert_eq!(green.0, 0); assert_eq!(green.1, 255); @@ -38,8 +41,8 @@ mod tests { #[test] fn unit_structs() { - // TODO: Instantiate a unit struct. - // let unit_struct = + let unit_struct = UnitStruct; + let message = format!("{unit_struct:?}s are fun!"); assert_eq!(message, "UnitStructs are fun!"); diff --git a/rustlings/exercises/07_structs/structs2.rs b/rustlings/exercises/07_structs/structs2.rs index 79141af..2539e31 100644 --- a/rustlings/exercises/07_structs/structs2.rs +++ b/rustlings/exercises/07_structs/structs2.rs @@ -33,8 +33,11 @@ mod tests { fn your_order() { let order_template = create_order_template(); - // TODO: Create your own order using the update syntax and template above! - // let your_order = + let your_order = Order { + name: String::from("Hacker in Rust"), + count: 1, + ..order_template + }; assert_eq!(your_order.name, "Hacker in Rust"); assert_eq!(your_order.year, order_template.year); diff --git a/rustlings/exercises/07_structs/structs3.rs b/rustlings/exercises/07_structs/structs3.rs index 69e5ced..d24da27 100644 --- a/rustlings/exercises/07_structs/structs3.rs +++ b/rustlings/exercises/07_structs/structs3.rs @@ -23,15 +23,12 @@ impl Package { } } - // TODO: Add the correct return type to the function signature. - fn is_international(&self) { - // TODO: Read the tests that use this method to find out when a package - // is considered international. + fn is_international(&self) -> bool { + self.sender_country != self.recipient_country } - // TODO: Add the correct return type to the function signature. - fn get_fees(&self, cents_per_gram: u32) { - // TODO: Calculate the package's fees. + fn get_fees(&self, cents_per_gram: u32) -> u32 { + self.weight_in_grams * cents_per_gram } } diff --git a/rustlings/solutions/07_structs/structs1.rs b/rustlings/solutions/07_structs/structs1.rs index dcf2377..98fafcc 100644 --- a/rustlings/solutions/07_structs/structs1.rs +++ b/rustlings/solutions/07_structs/structs1.rs @@ -1,4 +1,49 @@ +struct ColorRegularStruct { + red: u8, + green: u8, + blue: u8, +} + +struct ColorTupleStruct(u8, u8, u8); + +#[derive(Debug)] +struct UnitStruct; + fn main() { - // DON'T EDIT THIS SOLUTION FILE! - // It will be automatically filled after you finish the exercise. + // You can optionally experiment here. +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn regular_structs() { + let green = ColorRegularStruct { + red: 0, + green: 255, + blue: 0, + }; + + assert_eq!(green.red, 0); + assert_eq!(green.green, 255); + assert_eq!(green.blue, 0); + } + + #[test] + fn tuple_structs() { + let green = ColorTupleStruct(0, 255, 0); + + assert_eq!(green.0, 0); + assert_eq!(green.1, 255); + assert_eq!(green.2, 0); + } + + #[test] + fn unit_structs() { + let unit_struct = UnitStruct; + let message = format!("{unit_struct:?}s are fun!"); + + assert_eq!(message, "UnitStructs are fun!"); + } } diff --git a/rustlings/solutions/07_structs/structs2.rs b/rustlings/solutions/07_structs/structs2.rs index dcf2377..589dd93 100644 --- a/rustlings/solutions/07_structs/structs2.rs +++ b/rustlings/solutions/07_structs/structs2.rs @@ -1,4 +1,51 @@ +#[derive(Debug)] +struct Order { + name: String, + year: u32, + made_by_phone: bool, + made_by_mobile: bool, + made_by_email: bool, + item_number: u32, + count: u32, +} + +fn create_order_template() -> Order { + Order { + name: String::from("Bob"), + year: 2019, + made_by_phone: false, + made_by_mobile: false, + made_by_email: true, + item_number: 123, + count: 0, + } +} + fn main() { - // DON'T EDIT THIS SOLUTION FILE! - // It will be automatically filled after you finish the exercise. + // You can optionally experiment here. +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn your_order() { + let order_template = create_order_template(); + + let your_order = Order { + name: String::from("Hacker in Rust"), + count: 1, + // Struct update syntax + ..order_template + }; + + assert_eq!(your_order.name, "Hacker in Rust"); + assert_eq!(your_order.year, order_template.year); + assert_eq!(your_order.made_by_phone, order_template.made_by_phone); + assert_eq!(your_order.made_by_mobile, order_template.made_by_mobile); + assert_eq!(your_order.made_by_email, order_template.made_by_email); + assert_eq!(your_order.item_number, order_template.item_number); + assert_eq!(your_order.count, 1); + } } diff --git a/rustlings/solutions/07_structs/structs3.rs b/rustlings/solutions/07_structs/structs3.rs index dcf2377..3f878cc 100644 --- a/rustlings/solutions/07_structs/structs3.rs +++ b/rustlings/solutions/07_structs/structs3.rs @@ -1,4 +1,83 @@ +#[derive(Debug)] +struct Package { + sender_country: String, + recipient_country: String, + weight_in_grams: u32, +} + +impl Package { + fn new(sender_country: String, recipient_country: String, weight_in_grams: u32) -> Self { + if weight_in_grams < 10 { + // This isn't how you should handle errors in Rust, but we will + // learn about error handling later. + panic!("Can't ship a package with weight below 10 grams"); + } + + Self { + sender_country, + recipient_country, + weight_in_grams, + } + } + + fn is_international(&self) -> bool { + // ^^^^^^^ added + self.sender_country != self.recipient_country + } + + fn get_fees(&self, cents_per_gram: u32) -> u32 { + // ^^^^^^ added + self.weight_in_grams * cents_per_gram + } +} + fn main() { - // DON'T EDIT THIS SOLUTION FILE! - // It will be automatically filled after you finish the exercise. + // You can optionally experiment here. +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + #[should_panic] + fn fail_creating_weightless_package() { + let sender_country = String::from("Spain"); + let recipient_country = String::from("Austria"); + + Package::new(sender_country, recipient_country, 5); + } + + #[test] + fn create_international_package() { + let sender_country = String::from("Spain"); + let recipient_country = String::from("Russia"); + + let package = Package::new(sender_country, recipient_country, 1200); + + assert!(package.is_international()); + } + + #[test] + fn create_local_package() { + let sender_country = String::from("Canada"); + let recipient_country = sender_country.clone(); + + let package = Package::new(sender_country, recipient_country, 1200); + + assert!(!package.is_international()); + } + + #[test] + fn calculate_transport_fees() { + let sender_country = String::from("Spain"); + let recipient_country = String::from("Spain"); + + let cents_per_gram = 3; + + let package = Package::new(sender_country, recipient_country, 1500); + + assert_eq!(package.get_fees(cents_per_gram), 4500); + assert_eq!(package.get_fees(cents_per_gram * 2), 9000); + } } |