rust rusting कुछ और कोई नहीं, वे क्या हैं?




rusting of iron project (3)

जबकि कुछ छोटे शुरुआती अभ्यासों को रस्ट करने की कोशिश करते हुए प्रोग्रामिंग करते हुए, मुझे कुछ आउटपुट मिले जो मुझे समझ में नहीं आ रहे हैं Vec::get । यहाँ कोड है:

fn main() {
    let command = [('G', 'H'), ('H', '5')];

    for i in 0..3 {
        print!(" {} ", i);
        println!("{:?}", command.get(i));
    }
}

आउटपुट है

0 Some(('G', 'H'))
1 Some(('H', '5'))
2 None

मैंने पहले हास्केल में डब किया है, और इसका मतलब है कि मैंने 10 मिनट के लिए एक ट्यूटोरियल साइट को देखा और वापस C ++ पर भाग गया, लेकिन मुझे याद है कि हास्केल के लिए Some और None बारे में Some पढ़ना है। मुझे यहां रस्ट में यह देखकर आश्चर्य हुआ। क्या कोई समझा सकता है कि .get() Some या None लौटाता है?


get के get (स्लाइस के लिए, Vec नहीं , क्योंकि आप एक सरणी / स्लाइस का उपयोग कर रहे हैं) का हस्ताक्षर है

fn get(&self, index: usize) -> Option<&T>

यही है, यह एक Option देता है, जो एक एंम की तरह परिभाषित है

pub enum Option<T> {
    None,
    Some(T),
}

None और Some एनुम के वेरिएंट हैं, अर्थात, टाइप Option<T> साथ एक मान या तो None भी हो सकता है, या यह Some प्रकार के T युक्त मान हो सकता है।

यह कोर data Maybe a = Nothing | Just a के समान ही है data Maybe a = Nothing | Just a हास्केल में data Maybe a = Nothing | Just a प्रकार; दोनों एक वैकल्पिक मूल्य का प्रतिनिधित्व करते हैं, यह या तो वहाँ है ( Some / Just ), या यह नहीं है ( None / Nothing )।

इन प्रकारों का उपयोग अक्सर विफलता का प्रतिनिधित्व करने के लिए किया जाता है, जब कोई चीज असफल हो जाती है, उदाहरण के लिए, केवल एक ही संभावना है कि। सीमा, अन्यथा यह अनुरोधित सूचक वाले Some देता है।


Some और None इस तथ्य के इर्दगिर्द काम करने के विहित "सुरक्षित" तरीके के बारे में सोचें कि रूल भाषा NULL पॉइंटर्स के "सुरक्षित" उपयोग का समर्थन नहीं करती है। चूंकि आपके Vec की लंबाई 3 है, और आपने केवल दो जोड़े निर्दिष्ट किए हैं, तीसरी जोड़ी प्रभावी रूप से NULL ; NULL को वापस करने के बजाय, यह None लौटाता है।

जंग हमें Some / None , हमेशा वापस None होने की संभावना से निपटने के लिए, संकलन-समय पर मजबूर करके सुरक्षा गारंटी प्रदान करता है।


command एक वेक्टर नहीं है ( Vec<T> टाइप करें), यह एक निश्चित आकार की सरणी है (आपके मामले में [(char, char); 2] )), और सरणियों को स्वचालित रूप से स्लाइस (सरणियों में विचार) में उधार लिया जाता है, इसलिए आप स्लाइस पर परिभाषित सभी तरीकों का उपयोग कर सकते हैं, जिसमें शामिल get :

दिए गए सूचकांक में एक स्लाइस का तत्व लौटाता है, या None अगर सूचकांक सीमा से बाहर है।

व्यवहार बहुत स्पष्ट है: जब सूचकांक को मान्य किया जाता है, तो यह उस सूचकांक के तत्व के साथ Some देता है, अन्यथा यह None लौटाता है।

एक स्लाइस में तत्वों को एक्सेस करने का एक और तरीका है - इंडेक्सिंग ऑपरेटर, जो आपको परिचित होना चाहिए:

let nums = [1, 2, 3];
let x = nums[1];

यह सीधे स्लाइस के तत्व को लौटाता है, लेकिन यह मौजूदा कार्य को विफल कर देगा यदि सूचकांक सीमा से बाहर है:

fn main() {
    let x = [1, 2];
    for i in 0..3 {
        println!("{}", x[i]);
    }
}

यह कार्यक्रम विफल रहता है:

% ./main2
1
2
task '<main>' failed at 'index out of bounds: the len is 2 but the index is 2', main2.rs:4

सुविधा के लिए विधि get() करना आवश्यक है; यह आपको अग्रिम में जाँचने से बचाता है कि दिया गया सूचकांक वैध है या नहीं।

यदि आप नहीं जानते कि Some और None वास्तव में क्या हैं और सामान्य रूप से उनकी आवश्यकता क्यों है, तो आपको official tutorial पढ़ना चाहिए, यह बताता है क्योंकि यह बहुत ही मूल अवधारणा है।







rust