From 012359ddfcf997ccb2a892742a6923b4916f3f75 Mon Sep 17 00:00:00 2001 From: matytan <-f> Date: Fri, 25 Nov 2022 20:05:08 +0800 Subject: [PATCH] day10 --- exercises/standard_library_types/arc1.rs | 7 ++----- exercises/standard_library_types/box1.rs | 10 +++++----- exercises/standard_library_types/cow1.rs | 4 +--- exercises/standard_library_types/iterators5.rs | 2 -- exercises/standard_library_types/rc1.rs | 10 ++++++---- exercises/threads/threads1.rs | 12 ++++-------- exercises/threads/threads2.rs | 8 +++++--- exercises/traits/traits4.rs | 2 +- 8 files changed, 24 insertions(+), 31 deletions(-) diff --git a/exercises/standard_library_types/arc1.rs b/exercises/standard_library_types/arc1.rs index 93a27036..787e1bb9 100644 --- a/exercises/standard_library_types/arc1.rs +++ b/exercises/standard_library_types/arc1.rs @@ -12,25 +12,22 @@ // Because we are using threads, our values need to be thread-safe. Therefore, // we are using Arc. We need to make a change in each of the two TODOs. - // Make this code compile by filling in a value for `shared_numbers` where the // first TODO comment is, and create an initial binding for `child_numbers` // where the second TODO comment is. Try not to create any copies of the `numbers` Vec! // Execute `rustlings hint arc1` or use the `hint` watch subcommand for a hint. -// I AM NOT DONE - #![forbid(unused_imports)] // Do not change this, (or the next) line. use std::sync::Arc; use std::thread; fn main() { let numbers: Vec<_> = (0..100u32).collect(); - let shared_numbers = // TODO + let shared_numbers = Arc::new(numbers); // TODO let mut joinhandles = Vec::new(); for offset in 0..8 { - let child_numbers = // TODO + let child_numbers = shared_numbers.clone(); // TODO joinhandles.push(thread::spawn(move || { let sum: u32 = child_numbers.iter().filter(|n| *n % 8 == offset).sum(); println!("Sum of offset {} is {}", offset, sum); diff --git a/exercises/standard_library_types/box1.rs b/exercises/standard_library_types/box1.rs index 66cf00f3..35d1edd9 100644 --- a/exercises/standard_library_types/box1.rs +++ b/exercises/standard_library_types/box1.rs @@ -16,11 +16,9 @@ // // Execute `rustlings hint box1` or use the `hint` watch subcommand for a hint. -// I AM NOT DONE - #[derive(PartialEq, Debug)] pub enum List { - Cons(i32, List), + Cons(i32, Box), Nil, } @@ -33,11 +31,13 @@ fn main() { } pub fn create_empty_list() -> List { - todo!() + // todo!() + List::Nil } pub fn create_non_empty_list() -> List { - todo!() + // todo!() + List::Cons(1, Box::new(List::Nil)) } #[cfg(test)] diff --git a/exercises/standard_library_types/cow1.rs b/exercises/standard_library_types/cow1.rs index 5fba2519..2e4483de 100644 --- a/exercises/standard_library_types/cow1.rs +++ b/exercises/standard_library_types/cow1.rs @@ -5,8 +5,6 @@ // It can enclose and provide immutable access to borrowed data, and clone the data lazily when mutation or ownership is required. // The type is designed to work with general borrowed data via the Borrow trait. -// I AM NOT DONE - use std::borrow::Cow; fn abs_all<'a, 'b>(input: &'a mut Cow<'b, [i32]>) -> &'a mut Cow<'b, [i32]> { @@ -42,7 +40,7 @@ fn main() { let mut input = Cow::from(slice); match abs_all(&mut input) { // TODO - Cow::Borrowed(_) => println!("I own this slice!"), + Cow::Owned(_) => println!("I own this slice!"), _ => panic!("expected borrowed value"), } } diff --git a/exercises/standard_library_types/iterators5.rs b/exercises/standard_library_types/iterators5.rs index e2897e27..0926baa1 100644 --- a/exercises/standard_library_types/iterators5.rs +++ b/exercises/standard_library_types/iterators5.rs @@ -13,8 +13,6 @@ // // Make the code compile and the tests pass. -// I AM NOT DONE - use std::collections::HashMap; #[derive(Clone, Copy, PartialEq, Eq)] diff --git a/exercises/standard_library_types/rc1.rs b/exercises/standard_library_types/rc1.rs index 9b907fde..c02d1f89 100644 --- a/exercises/standard_library_types/rc1.rs +++ b/exercises/standard_library_types/rc1.rs @@ -5,7 +5,6 @@ // Make this code compile by using the proper Rc primitives to express that the sun has multiple owners. -// I AM NOT DONE use std::rc::Rc; #[derive(Debug)] @@ -54,17 +53,17 @@ fn main() { jupiter.details(); // TODO - let saturn = Planet::Saturn(Rc::new(Sun {})); + let saturn = Planet::Saturn(Rc::clone(&sun)); println!("reference count = {}", Rc::strong_count(&sun)); // 7 references saturn.details(); // TODO - let uranus = Planet::Uranus(Rc::new(Sun {})); + let uranus = Planet::Uranus(Rc::clone(&sun)); println!("reference count = {}", Rc::strong_count(&sun)); // 8 references uranus.details(); // TODO - let neptune = Planet::Neptune(Rc::new(Sun {})); + let neptune = Planet::Neptune(Rc::clone(&sun)); println!("reference count = {}", Rc::strong_count(&sun)); // 9 references neptune.details(); @@ -86,12 +85,15 @@ fn main() { println!("reference count = {}", Rc::strong_count(&sun)); // 4 references // TODO + drop(earth); println!("reference count = {}", Rc::strong_count(&sun)); // 3 references // TODO + drop(venus); println!("reference count = {}", Rc::strong_count(&sun)); // 2 references // TODO + drop(mercury); println!("reference count = {}", Rc::strong_count(&sun)); // 1 reference assert_eq!(Rc::strong_count(&sun), 1); diff --git a/exercises/threads/threads1.rs b/exercises/threads/threads1.rs index e59f4ce4..2d81fbf6 100644 --- a/exercises/threads/threads1.rs +++ b/exercises/threads/threads1.rs @@ -2,30 +2,26 @@ // Execute `rustlings hint threads1` or use the `hint` watch subcommand for a hint. // This program should wait until all the spawned threads have finished before exiting. -// I AM NOT DONE - use std::thread; use std::time::Duration; - fn main() { - let mut handles = vec![]; for i in 0..10 { - thread::spawn(move || { + handles.push(thread::spawn(move || { thread::sleep(Duration::from_millis(250)); - println!("thread {} is complete", i); - }); + println!("hello from thread {}", i); + })) } let mut completed_threads = 0; for handle in handles { // TODO: a struct is returned from thread::spawn, can you use it? + handle.join().unwrap(); completed_threads += 1; } if completed_threads != 10 { panic!("Oh no! All the spawned threads did not finish!"); } - } diff --git a/exercises/threads/threads2.rs b/exercises/threads/threads2.rs index ada3d14a..6f39a159 100644 --- a/exercises/threads/threads2.rs +++ b/exercises/threads/threads2.rs @@ -5,7 +5,7 @@ // I AM NOT DONE -use std::sync::Arc; +use std::sync::{Arc, Mutex}; use std::thread; use std::time::Duration; @@ -15,13 +15,15 @@ struct JobStatus { fn main() { let status = Arc::new(JobStatus { jobs_completed: 0 }); + let mtx = Arc::new(Mutex::new(JobStatus { jobs_completed: 0 })); let mut handles = vec![]; for _ in 0..10 { let status_shared = Arc::clone(&status); + let mtx = Arc::clone(&mtx); let handle = thread::spawn(move || { thread::sleep(Duration::from_millis(250)); // TODO: You must take an action before you update a shared value - status_shared.jobs_completed += 1; + mtx.lock().unwrap().jobs_completed += 1 }); handles.push(handle); } @@ -29,6 +31,6 @@ fn main() { handle.join().unwrap(); // TODO: Print the value of the JobStatus.jobs_completed. Did you notice anything // interesting in the output? Do you have to 'join' on all the handles? - println!("jobs completed {}", ???); + println!("jobs completed {:?}", mtx.lock().unwrap().jobs_completed) } } diff --git a/exercises/traits/traits4.rs b/exercises/traits/traits4.rs index 6e829787..ab2d6447 100644 --- a/exercises/traits/traits4.rs +++ b/exercises/traits/traits4.rs @@ -18,7 +18,7 @@ impl Licensed for SomeSoftware {} impl Licensed for OtherSoftware {} // YOU MAY ONLY CHANGE THE NEXT LINE -fn compare_license_types(software: &impl Licensed, software_two: &impl Licensed) -> bool { +fn compare_license_types(software: impl Licensed, software_two: impl Licensed) -> bool { software.licensing_info() == software_two.licensing_info() }