تمرین: آمار سلامتی

شما در حال پیاده‌سازی یک سیستم پایش سلامت هستید. به عنوان بخشی از این کار، نیاز دارید تا آمار سلامت کاربران را دنبال کنید.

شما با یک تابع ابتدایی در بلوک impl و همچنین یک تعریف struct به نام User شروع خواهید کرد. هدف شما پیاده‌سازی متد ابتدایی در struct User است که در بلوک impl تعریف شده است.

کد زیر را به https://play.rust-lang.org/ کپی کنید و متد‌های ناقص را تکمیل کنید:

// TODO: این را زمانی که پیاده‌سازی‌تان تمام شد حذف کنید.
#![allow(unused_variables, dead_code)]


#![allow(dead_code)]
pub struct User {
    name: String,
    age: u32,
    height: f32,
    visit_count: usize,
    last_blood_pressure: Option<(u32, u32)>,
}

pub struct Measurements {
    height: f32,
    blood_pressure: (u32, u32),
}

pub struct HealthReport<'a> {
    patient_name: &'a str,
    visit_count: u32,
    height_change: f32,
    blood_pressure_change: Option<(i32, i32)>,
}

impl User {
    pub fn new(name: String, age: u32, height: f32) -> Self {
        Self { name, age, height, visit_count: 0, last_blood_pressure: None }
    }

    pub fn visit_doctor(&mut self, measurements: Measurements) -> HealthReport {
        todo!("به‌روزرسانی آمار یک کاربر بر اساس اندازه‌گیری معبار بازدید از پزشک")
    }
}

fn main() {
    let bob = User::new(String::from("Bob"), 32, 155.2);
    println!("من {} هستم و سن من {} است", bob.name, bob.age);
}

#[test]
fn test_visit() {
    let mut bob = User::new(String::from("Bob"), 32, 155.2);
    assert_eq!(bob.visit_count, 0);
    let report =
        bob.visit_doctor(Measurements { height: 156.1, blood_pressure: (120, 80) });
    assert_eq!(report.patient_name, "Bob");
    assert_eq!(report.visit_count, 1);
    assert_eq!(report.blood_pressure_change, None);
    assert!((report.height_change - 0.9).abs() < 0.00001);

    let report =
        bob.visit_doctor(Measurements { height: 156.1, blood_pressure: (115, 76) });

    assert_eq!(report.visit_count, 2);
    assert_eq!(report.blood_pressure_change, Some((-5, -4)));
    assert_eq!(report.height_change, 0.0);
}