ప్రధాన కంటెంట్‌కు వెళ్లండి
మాడ్యూల్ 5 · 2లో పాఠం 1కోర్సులో 9/14~12 min
మాడ్యూల్ పాఠాలు (1/2)

జెనరిక్స్ మరియు విధులు

జెనరిక్స్ విభిన్న డేటా రకాల కోసం తర్కం యొక్క నకిలీని నివారించడం ద్వారా సౌకర్యవంతమైన, పునర్వినియోగ కోడ్‌ను వ్రాయడానికి మిమ్మల్ని అనుమతిస్తుంది. వివిధ రకాలైన (i32, f64, లేదా String వంటి) బహుళ ఫంక్షన్‌లు లేదా నిర్మాణాలను నిర్వచించడానికి బదులుగా, మేము సాంప్రదాయకంగా T అక్షరంతో సూచించబడే సాధారణ రకం పరామితిని ఉపయోగించవచ్చు.

రస్ట్ కంపైలర్ మోనోమార్ఫిజేషన్ అనే ప్రక్రియను ఉపయోగించి జెనరిక్స్‌ను నిర్వహిస్తుంది: సంకలనం సమయంలో, వాస్తవానికి ఉపయోగించిన ప్రతి కాంక్రీట్ రకానికి సాధారణ కోడ్ కాపీని ఇది రూపొందిస్తుంది. దీని అర్థం ఓవర్‌హెడ్ సున్నా రన్‌టైమ్ పనితీరు ఉంది.


సాధారణ విధులు

జెనరిక్ ఫంక్షన్‌ను నిర్వచించడానికి, మేము ఫంక్షన్ పేరు తర్వాత మరియు ఆర్గ్యుమెంట్ జాబితాకు ముందు <T> టైప్ పరామితిని ఇన్‌సర్ట్ చేస్తాము:

Rust
fn print_value<T: std::fmt::Debug>(value: T) {
    println!("Value: {:?}", value);
}

జెనరిక్ ఫంక్షన్‌లలో, మేము ఆర్గ్యుమెంట్ రకాలు మరియు రిటర్న్ రకాలు రెండింటికీ సాధారణ రకాన్ని T ఉపయోగించవచ్చు:

Rust
fn identity<T>(value: T) -> T {
    value
}

సాధారణ నిర్మాణాలు

సౌకర్యవంతమైన ఫీల్డ్‌లను నిర్వచించడానికి మేము నిర్మాణాల లోపల (struct) సాధారణ రకం పారామితులను కూడా ఉపయోగించవచ్చు:

Rust
struct KeyValuePair<K, V> {
    key: K,
    value: V,
}

fn main() {
    let pair = KeyValuePair {
        key: String::from("age"),
        value: 30,
    };
}

సాధారణ నిర్మాణం కోసం impl బ్లాక్‌లో, మేము సాధారణ నిర్మాణంపై పద్ధతులను అమలు చేస్తున్నామని సూచించడానికి impl కీవర్డ్ తర్వాత వెంటనే టైప్ పారామీటర్ <T>ని ప్రకటించాలి:

Rust
struct Container<T> {
    value: T,
}

impl<T> Container<T> {
    fn new(value: T) -> Self {
        Container { value }
    }

    fn value(&self) -> &T {
        &self.value
    }
}

మీరే ప్రయత్నించండి

వ్యాయామం 1: పాయింట్ నిర్మాణం

వ్యాయామం#rust.m5.l1.e1
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

రెండు ఫీల్డ్‌లతో Point<T> అనే సాధారణ నిర్మాణాన్ని నిర్వచించండి: T రకం T మరియు y రకం T. ప్రధాన ఫంక్షన్‌లో, పూర్ణాంక విలువలు x = 5 మరియు y = 10తో పాయింట్‌ని కలిగి ఉన్న వేరియబుల్ పాయింట్‌ను ఇన్‌స్టాంటియేట్ చేసి, ఆపై point.x విలువను ముద్రించండి.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

`struct Point<T> { x: T, y: T }`ని ఉపయోగించి structని ప్రకటించండి. దీన్ని మెయిన్‌లో ఇన్‌స్టాంటియేట్ చేసి, ప్రింట్ చేయడానికి `point.x`ని ఉపయోగించండి.

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది

వ్యాయామం 2: స్వాప్‌తో టుపుల్‌ని రివర్స్ చేయడం

వ్యాయామం#rust.m5.l1.e2
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

swap<T> అనే పేరుతో ఒక సాధారణ ఫంక్షన్‌ను వ్రాయండి, అది రెండు మూలకాల (T, T) యొక్క టుపుల్‌ని అంగీకరించి, వాటి స్థానాలను తారుమారు చేసి కొత్త టుపుల్ (T, T)ని అందిస్తుంది. ప్రధాన ఫంక్షన్‌లో, టుపుల్ (1, 2)తో ఫంక్షన్‌ని కాల్ చేసి, ఫలితాన్ని ప్రింట్ చేయండి.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

ఫంక్షన్ సంతకం తప్పనిసరిగా `fn swap<T>(జత: (T, T)) -> (T, T)`అయి ఉండాలి. రివర్స్డ్ టుపుల్‌ను`(జత.1, జత.0)`తో తిరిగి ఇవ్వండి.

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది

వ్యాయామం 3: కంటైనర్ నిర్మాణం

వ్యాయామం#rust.m5.l1.e3
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

T రకం విలువ ఫీల్డ్‌ని కలిగి ఉన్న జెనరిక్ స్ట్రక్ట్ కంటైనర్<T>ని నిర్వచించండి. T రకం విలువను అంగీకరించి, కంటైనర్<T> యొక్క ఉదాహరణను అందించే కొత్త పద్ధతిని నిర్వచించడానికి జెనరిక్ ఇంప్ల్ బ్లాక్‌ని అమలు చేయండి.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

అనుబంధిత పద్ధతిని అమలు చేయడానికి `impl<T> కంటైనర్<T>`ని ఉపయోగించండి`fn కొత్త(విలువ: T) -> స్వీయ {కంటైనర్ {విలువ }}`.

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది