mirror of https://github.com/01-edu/public.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
2.6 KiB
110 lines
2.6 KiB
4 years ago
|
## blood_types
|
||
|
|
||
|
### Instructions
|
||
|
|
||
|
In this exercise you will create a model data model of blood types and an API to deal with blood types
|
||
|
|
||
|
Start by creating the data representation of the blood types:
|
||
|
- Create the enumerator `Antigen` that has 4 possibilities: A, B, O and AB And the enumerator `RhFactor` that has two possible values: Positive and Negative
|
||
|
|
||
|
- After, create the struct BloodType that contains two fields with the names antigen and rh_factor
|
||
|
|
||
|
- To provide a simple way to create blood types implement the trait FromStr for BloodType (which will allow us to use the `parse` method and the associated function from_str, so we can do:
|
||
|
|
||
|
```rust
|
||
|
let a_neg: BloodType = "A-".parse();
|
||
|
```
|
||
|
|
||
|
- Implement the std::cmp::Ord trait to make possible to sort a vector or array of BloodType's
|
||
|
|
||
|
- Implement the trait std::Debug for BloodType allowing to print a vector such as [BloodType { antigen: A, rh_factor: Positive}, BloodType{ antigen: B, rh_factor: Negative}] as [ A+, A-] using the formatting {:?}
|
||
|
|
||
|
Write three methods for BloodType:
|
||
|
|
||
|
- `can_receive_from`: which returns true if self can receive blood from `other` blood type
|
||
|
- `donors`: which returns all the blood types that can give blood to self
|
||
|
- `recipients`: which returns all the blood types that can receive blood from self
|
||
|
|
||
|
### Expected Functions and Structures
|
||
|
|
||
|
```rust
|
||
|
#[derive(Debug, PartialEq, Eq, Clone, PartialOrd, Ord)]
|
||
|
pub enum Antigen {
|
||
|
A,
|
||
|
AB,
|
||
|
B,
|
||
|
O,
|
||
|
}
|
||
|
|
||
|
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone)]
|
||
|
enum RhFactor {
|
||
|
Positive,
|
||
|
Negative,
|
||
|
}
|
||
|
|
||
|
#[derive(PartialEq, Eq, PartialOrd)]
|
||
|
pub struct BloodType {
|
||
|
pub antigen: Antigen,
|
||
|
pub rh_factor: RhFactor,
|
||
|
}
|
||
|
|
||
|
use std::cmp::{Ord, Ordering};
|
||
|
|
||
|
use std::str::FromStr;
|
||
|
|
||
|
impl FromStr for Antigen {
|
||
|
}
|
||
|
|
||
|
impl FromStr for RhFactor {
|
||
|
}
|
||
|
|
||
|
impl Ord for BloodType {
|
||
|
}
|
||
|
|
||
|
impl FromStr for BloodType {
|
||
|
}
|
||
|
|
||
|
use std::fmt::{self, Debug};
|
||
|
|
||
|
impl Debug for BloodType {
|
||
|
}
|
||
|
|
||
|
impl BloodType {
|
||
|
pub fn can_receive_from(&self, other: &Self) -> bool {
|
||
|
}
|
||
|
|
||
|
pub fn donors(&self) -> Vec<Self> {
|
||
|
}
|
||
|
|
||
|
pub fn recipients(&self) -> Vec<BloodType> {
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### Usage
|
||
|
|
||
|
Here is a program to test your function.
|
||
|
|
||
|
```rust
|
||
|
fn main() {
|
||
|
let blood_type: BloodType = "O+".parse().unwrap();
|
||
|
println!("recipients of O+ {:?}", blood_type.recipients());
|
||
|
println!("donors of O+ {:?}", blood_type.donors());
|
||
|
let another_blood_type: BloodType = "A-".parse().unwrap();
|
||
|
println!(
|
||
|
"donors of O+ can receive from {:?} {:?}",
|
||
|
&another_blood_type,
|
||
|
blood_type.can_receive_from(&another_blood_type)
|
||
|
);
|
||
|
}
|
||
|
```
|
||
|
|
||
|
And its output
|
||
|
|
||
|
```console
|
||
|
student@ubuntu:~/[[ROOT]]/test$ cargo run
|
||
|
recipients of O+ [AB+, O+, A+, B+]
|
||
|
donors of O+ [O+, O-]
|
||
|
donors of O+ can receive from A- false
|
||
|
student@ubuntu:~/[[ROOT]]/test$
|
||
|
```
|