mirror of
https://github.com/rust-lang/rustlings.git
synced 2026-01-07 03:09:19 +00:00
Solve threads and some conversions
This commit is contained in:
parent
8039ced662
commit
5b073bb05d
@ -18,7 +18,6 @@ impl Default for Person {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// I AM NOT DONE
|
|
||||||
// Your task is to complete this implementation
|
// Your task is to complete this implementation
|
||||||
// in order for the line `let p = Person::from("Mark,20")` to compile
|
// in order for the line `let p = Person::from("Mark,20")` to compile
|
||||||
// Please note that you'll need to parse the age component into a `usize`
|
// Please note that you'll need to parse the age component into a `usize`
|
||||||
@ -35,6 +34,23 @@ impl Default for Person {
|
|||||||
// Otherwise, then return an instantiated Person object with the results
|
// Otherwise, then return an instantiated Person object with the results
|
||||||
impl From<&str> for Person {
|
impl From<&str> for Person {
|
||||||
fn from(s: &str) -> Person {
|
fn from(s: &str) -> Person {
|
||||||
|
// Can be neglected as in this case the age rule will always fail
|
||||||
|
// if s.len() == 0 {
|
||||||
|
// return Person::default();
|
||||||
|
// }
|
||||||
|
let mut splits = s.splitn(2, ',');
|
||||||
|
let name = splits.next().unwrap();
|
||||||
|
let part = splits.next().unwrap_or_default().parse::<usize>();
|
||||||
|
// Person can never be aged 0
|
||||||
|
let age = part.unwrap_or_default();
|
||||||
|
if name.len() > 0 && age > 0 {
|
||||||
|
return Person {
|
||||||
|
name: String::from(name),
|
||||||
|
age: age
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return Person::default();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -75,6 +91,7 @@ mod tests {
|
|||||||
fn test_bad_age() {
|
fn test_bad_age() {
|
||||||
// Test that "Mark.twenty" will return the default person due to an error in parsing age
|
// Test that "Mark.twenty" will return the default person due to an error in parsing age
|
||||||
let p = Person::from("Mark,twenty");
|
let p = Person::from("Mark,twenty");
|
||||||
|
println!("{:?}", p);
|
||||||
assert_eq!(p.name, "John");
|
assert_eq!(p.name, "John");
|
||||||
assert_eq!(p.age, 30);
|
assert_eq!(p.age, 30);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,13 +2,12 @@
|
|||||||
// Please note that the `as` operator is not only used when type casting.
|
// Please note that the `as` operator is not only used when type casting.
|
||||||
// It also helps with renaming imports.
|
// It also helps with renaming imports.
|
||||||
|
|
||||||
// I AM NOT DONE
|
|
||||||
// The goal is to make sure that the division does not fail to compile
|
// The goal is to make sure that the division does not fail to compile
|
||||||
fn average(values: &[f64]) -> f64 {
|
fn average(values: &[f64]) -> f64 {
|
||||||
let total = values
|
let total = values
|
||||||
.iter()
|
.iter()
|
||||||
.fold(0.0, |a, b| a + b);
|
.fold(0.0, |a, b| a + b);
|
||||||
total / values.len()
|
total / (values.len() as f64)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|||||||
@ -5,9 +5,7 @@
|
|||||||
// of "waiting..." and the program ends without timing out when running,
|
// of "waiting..." and the program ends without timing out when running,
|
||||||
// you've got it :)
|
// you've got it :)
|
||||||
|
|
||||||
// I AM NOT DONE
|
use std::sync::{Arc, Mutex};
|
||||||
|
|
||||||
use std::sync::Arc;
|
|
||||||
use std::thread;
|
use std::thread;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
@ -16,15 +14,19 @@ struct JobStatus {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let status = Arc::new(JobStatus { jobs_completed: 0 });
|
// Introduce Mutex
|
||||||
|
let status = Arc::new(Mutex::new(JobStatus { jobs_completed: 0 }));
|
||||||
let status_shared = status.clone();
|
let status_shared = status.clone();
|
||||||
thread::spawn(move || {
|
thread::spawn(move || {
|
||||||
for _ in 0..10 {
|
for _ in 0..10 {
|
||||||
thread::sleep(Duration::from_millis(250));
|
thread::sleep(Duration::from_millis(250));
|
||||||
status_shared.jobs_completed += 1;
|
// Lock mutex and make mutable
|
||||||
|
let mut jobStatus = status_shared.lock().unwrap();
|
||||||
|
jobStatus.jobs_completed += 1;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
while status.jobs_completed < 10 {
|
// Not assigning should release lock before sleep
|
||||||
|
while status.lock().unwrap().jobs_completed < 10 {
|
||||||
println!("waiting... ");
|
println!("waiting... ");
|
||||||
thread::sleep(Duration::from_millis(500));
|
thread::sleep(Duration::from_millis(500));
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user