练习:健康统计

你正在实现一个健康监控系统。作为其中的一部分,你需要对用户的健康统计数据进行追踪。

You’ll start with a stubbed function in an impl block as well as a User struct definition. Your goal is to implement the stubbed out method on the User struct defined in the impl block.

Copy the code below to <https://play.rust-lang.org/> and fill in the missing method:

1. // TODO: remove this when you're done with your implementation.
2. #![allow(unused_variables, dead_code)]

4. #![allow(dead_code)]
5. pub struct User {
6. name: String,
7. age: u32,
8. height: f32,
9. visit_count: usize,
10. last_blood_pressure: Option<(u32, u32)>,
11. }

13. pub struct Measurements {
14. height: f32,
15. blood_pressure: (u32, u32),
16. }

18. pub struct HealthReport<'a> {
19. patient_name: &'a str,
20. visit_count: u32,
21. height_change: f32,
22. blood_pressure_change: Option<(i32, i32)>,
23. }

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

30. pub fn visit_doctor(&mut self, measurements: Measurements) -> HealthReport {
31. todo!("Update a user's statistics based on measurements from a visit to the doctor")
32. }
33. }

35. fn main() {
36. let bob = User::new(String::from("Bob"), 32, 155.2);
37. println!("I'm {} and my age is {}", bob.name, bob.age);
38. }

40. #[test]
41. fn test_visit() {
42. let mut bob = User::new(String::from("Bob"), 32, 155.2);
43. assert_eq!(bob.visit_count, 0);
44. let report =
45. bob.visit_doctor(Measurements { height: 156.1, blood_pressure: (120, 80) });
46. assert_eq!(report.patient_name, "Bob");
47. assert_eq!(report.visit_count, 1);
48. assert_eq!(report.blood_pressure_change, None);

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

53. assert_eq!(report.visit_count, 2);
54. assert_eq!(report.blood_pressure_change, Some((-5, -4)));
55. }