चाचणीपूर्व दुसरा व्यायाम करण्याची वेळ आली आहे.

दिले: Super, समर्थकांचा उपसंच परत करा.

आम्हाला a जोडण्यासाठी मॉडेल बदलण्याची आवश्यकता आहे sidekick प्रकार विशेषता: Super,

अंमलबजावणी अगदी सोपी वाटते.

pub struct Super<'a> {
    pub super_name: &'a str,
    pub real_name: &'a str,
    pub power: u16,
    pub sidekick: Option<Super<'a>>,
}

दुर्दैवाने, वरील कोड संकलित केलेला नाही.

error[E0072]: recursive type `Super` has infinite size
 --> src/model.rs:2:1
  |
2 | pub struct Super<'a> {
  | ^^^^^^^^^^^^^^^^^^^^ recursive type has infinite size
...
6 |     pub sidekick: Option<Super<'a>>,
  |                   ----------------- recursive without indirection
  |
help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `Super` representable
  |
6 |     pub sidekick: Box<Option<Super<'a>>>,
  |

असे दिसते की गंज स्वतःला संदर्भित करू शकत नाही. कंपाईलरच्या सूचनेचे अनुसरण करा. प्रकाराऐवजी दुवा वापरणे ही “सुलभ” सुधारणा आहे.

pub struct Super<'a> {
    pub super_name: &'a str,
    pub real_name: &'a str,
    pub power: u16,
    pub sidekick: &'a Option<Super<'a>>,
}

प्रकार संकलित केले जात असताना, चाचण्या नाहीत.

error[E0515]: cannot return value referencing temporary value
  --> src/tests/samples.rs:5:5
   |
5  | /     Super {
6  | |         super_name: "Batman",
7  | |         real_name: "Bruce Wayne",
8  | |         power: 50,
9  | |         sidekick: &Some(robin()),
   | |                    ------------- temporary value created here
10 | |     }
   | |_____^ returns a value referencing data owned by the current function

पहिल्या स्थानावर परत या. संकलकाने त्याच्या वापराचे संकेतही दिले Box,

रस्टची सर्व मूल्ये डीफॉल्टनुसार संग्रहित केली जातात. ए तयार करून मूल्ये बंद केली जाऊ शकतात (ढिगाऱ्याला नियुक्त केली जाऊ शकतात) Box<T>, बॉक्स प्रकाराच्या संचित मूल्याचे स्मार्ट सूचक आहे T“जेव्हा बॉक्स चौकटीच्या बाहेर जातो, तेव्हा त्याचा विध्वंसक म्हटले जाते, आतील वस्तू नष्ट केली जाते, ile ढिगावरील स्मृती मोकळी होते.

तो वापरत असलेला नवीन कोड येथे आहे: Box:

pub struct Super<'a> {
    pub super_name: &'a str,
    pub real_name: &'a str,
    pub power: u16,
    pub sidekick: Box<Option<Super<'a>>>,
}

हे चाचणी नमुन्यांसह सर्वकाही एकत्र करते.

pub(in crate::tests) fn batman<'a>() -> Super<'a> {
    Super {
        super_name: "Batman",
        real_name: "Bruce Wayne",
        power: 50,
        sidekick: Box::from(Some(robin())),     (1)
    }
}

1: “बॉक्स” मध्ये व्हेरिएबल वापरा Box.from() कार्य:

शेवटी, उपाय सोपा आहे.

pub mod j {
    use crate::model::Super;

    pub fn find_supers_with_sidekicks<'a>(supers: &'a Vec<Super<'a>>) -> Vec<&Super<'a>> {
        supers
            .iter()                             (1)
            .filter(|&s| s.sidekick.is_some())   (2)
            .collect()                          (3)
    }
}

1: वेक्टर घटकांची पुनरावृत्ती करा
2: ज्यांना समर्थक आहेत त्यांनाच वाचवा
3: उर्वरित वस्तू गोळा करा

समाधान चाचणी भाषेत नवीन कल्पना आणत नाही.