முக்கிய உள்ளடக்கத்திற்குச் செல்லவும்
தொகுதி 6 · பாடம் 2 இன் 2பாடத்திட்டத்தில் 12/14~15 min
தொகுதி பாடங்கள் (2/2)

ஸ்மார்ட் பாயிண்டர்கள்: பெட்டி மற்றும் Rc

ஸ்மார்ட் பாயிண்டர் என்பது ஒரு சுட்டியைப் போல் செயல்படும் தரவுக் கட்டமைப்பாகும், ஆனால் மெட்டாடேட்டா மற்றும் கூடுதல் திறன்களைக் கொண்டுள்ளது (குறிப்பு எண்ணுதல் அல்லது தானியங்கி நினைவக மேலாண்மை போன்றவை).

ரஸ்டில், சாதாரண குறிப்புகள் (& போன்றவை) தரவை மட்டுமே கடன் வாங்கும். ஸ்மார்ட் சுட்டிகள், மறுபுறம், அவர்கள் சுட்டிக்காட்டும் தரவை பெரும்பாலும் சொந்தமாக வைத்திருக்கிறார்கள். பொதுவான எடுத்துக்காட்டுகளில் String மற்றும் Vec<T> ஆகியவை அடங்கும், ஆனால் நிலையான நூலகம் பிற சிறப்பு வாய்ந்தவற்றை வழங்குகிறது.


குவியல் ஒதுக்கீட்டுக்கான பெட்டி<T>

எளிமையான ஸ்மார்ட் பாயிண்டர் Box<T> ஆகும், இது அடுக்கை விட குவியல் இல் தரவைச் சேமிக்கிறது. குவியலாக ஒதுக்கப்பட்ட தரவுக்கான சுட்டி மட்டுமே அடுக்கில் இருக்கும்.

இது முக்கியமாக பின்வரும் சந்தர்ப்பங்களில் பயன்படுத்தப்படுகிறது:

  1. தொகுக்கும் நேரத்தில் (சுழற்சி வகை போன்ற) அளவை அறிய முடியாத வகை உங்களிடம் இருந்தால், சரியான அளவு தேவைப்படும் சூழலில் அந்த வகையின் மதிப்பைப் பயன்படுத்த விரும்புகிறீர்கள்.
  2. பெரிய அளவிலான தரவின் உரிமையை நகலெடுக்காமல் மாற்ற விரும்பினால்.

அடிப்படை உதாரணம்:

Rust
fn main() {
    let b = Box::new(5); // allocates the value 5 on the heap
    println!("b = {}", *b); // dereferences with * to read the value
}

சுழல்நிலை வகைகள் மற்றும் தீமைகள் பட்டியல்கள்

சுழல்நிலை வகை என்பது அதன் வரையறையின் ஒரு பகுதியாக அதன் மதிப்பைக் கொண்டிருக்கும் வகையாகும். தொகுக்கும் நேரத்தில் ரஸ்ட் ஒரு வகையின் சரியான அளவை அறிந்திருக்க வேண்டும். ஒரு சுழல்நிலை வகையின் ஆழம் எல்லையற்றதாக இருக்கக்கூடும் என்பதால், நீங்கள் ஒரு பெட்டியைப் பயன்படுத்தாத வரை கம்பைலர் பிழையை உருவாக்கும் (இது ஒரு நிலையான அளவைக் கொண்டுள்ளது, ஏனெனில் இது ஒரு சுட்டிக்காட்டி):

Rust
enum List {
    Cons(i32, Box<List>),
    Nil,
}

Rc<T>: குறிப்பு எண்ணுதல்

ஒரு மதிப்பு பல உரிமையாளர்களைக் கொண்டிருக்கும் சந்தர்ப்பங்கள் உள்ளன. Rc<T> (குறிப்பு எண்ணப்பட்டது) ஸ்மார்ட் பாயிண்டர், மதிப்பு இன்னும் பயன்பாட்டில் உள்ளதா என்பதைத் தீர்மானிக்க, மதிப்புக்கான குறிப்புகளின் எண்ணிக்கையைக் கண்காணிக்கும். எண்ணிக்கை பூஜ்ஜியத்திற்குக் குறைந்தால், ஆதாரம் பாதுகாப்பாக ஒதுக்கப்படும்.

[!குறிப்பு] Rc<T> ஒற்றை-திரிக்கப்பட்ட காட்சிகளுக்கு மட்டுமே பொருத்தமானது. மல்டி-த்ரெட் (ஒரே நேரத்தில்) காட்சிகளுக்கு, நீங்கள் Arc<T> (அணு குறிப்பு கணக்கிடப்பட்டது) பயன்படுத்த வேண்டும்.

Rust
use std::rc::Rc;

fn main() {
    let a = Rc::new(5);
    let b = Rc::clone(&a); // increments the reference count to 2
    println!("References: {}", Rc::strong_count(&a));
}

நீங்களே முயற்சி செய்து பாருங்கள்

பயிற்சி 1: பெட்டியுடன் குவியல் ஒதுக்கீடு

உடற்பயிற்சி#rust.m6.l2.e1
முயற்சிகள்: 0ஏற்றுகிறது…

Box ::new ஐப் பயன்படுத்தி குவியலில் 42 இன் முழு எண் மதிப்பை ஒதுக்கி, அதை val என்ற மாறிக்கு ஒதுக்கவும். அடுத்து, பெட்டியில் சேமிக்கப்பட்டுள்ள மதிப்பை * ஆபரேட்டருடன் வெளிப்படையாகக் குறைத்து அச்சிடவும்.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

மதிப்பைக் குவியலாகச் சேமித்து, `println!` க்குள் `*val` ஐக் குறிக்க `let val = Box::new(42);` ஐப் பயன்படுத்தவும்.

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

பயிற்சி 2: சுழல்நிலை தரவு அமைப்பு (தீமைகள் பட்டியல்)

உடற்பயிற்சி#rust.m6.l2.e2
முயற்சிகள்: 0ஏற்றுகிறது…

இரண்டு மாறுபாடுகளைக் கொண்ட பட்டியல் பெயரிடப்பட்ட சுழல்நிலை enum ஐ வரையறுக்கவும்: ஒரு tuple (i32, Box<List>) மற்றும் பட்டியலின் முடிவைக் குறிக்கும் Nil. முக்கிய செயல்பாட்டில், உறுப்பு 1 ஐத் தொடர்ந்து Nil ஐக் கொண்ட இணைக்கப்பட்ட பட்டியலை உடனடியாக உருவாக்கவும்.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

enum ஆனது `enum List { Cons(i32, Box<List>), Nil }`என அறிவிக்கப்படுகிறது. பட்டியலை உடனடியாக`List::Cons(1, Box::new(List::Nil))` மூலம் உருவாக்கவும்.

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

பயிற்சி 3: Rc உடன் உரிமையைப் பகிர்தல்

உடற்பயிற்சி#rust.m6.l2.e3
முயற்சிகள்: 0ஏற்றுகிறது…

std::rc::Rc ஐப் பயன்படுத்தி, ஒரு மாறியில் 100 மதிப்பைக் கொண்ட பகிரப்பட்ட முழு எண்ணை உருவாக்கவும். Rc ::clone ஐப் பயன்படுத்தி b மாறி குறிப்பை குளோன் செய்யவும். இறுதியாக, Rc::strong_count செயல்பாட்டைப் பயன்படுத்தி செயலில் உள்ள குறிப்புகளின் எண்ணிக்கையை அச்சிடவும்.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

`Rc::new(100)`மூலம் மதிப்பை உருவாக்கவும்.`Rc::clone(&a)` உடன் குளோன் செய்து, உரிமையாளர் எண்ணிக்கையை`Rc::strong_count(&a)` உடன் காட்டவும்.

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்