Rust में स्वच्छ कोड: सुरुचिपूर्ण और कुशल लेखन

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Rust में स्वच्छ कोड क्यों ज़रूरी है?

\n\n

Rust एक ऐसी भाषा है जो डेवलपर से अनुशासन की मांग करती है। इसका कंपाइलर सख्त लेकिन निष्पक्ष है: यह मेमोरी में लापरवाही माफ नहीं करता, लेकिन बदले में अविश्वसनीय गति और सुरक्षा देता है। हालांकि, Rust की पूरी क्षमता को उजागर करने के लिए सिर्फ कोड को कंपाइल करवाना काफी नहीं है। आपको स्वच्छ कोड लिखना होगा - जो समझने, बनाए रखने और सुरुचिपूर्ण हो।

\n\n

इस लेख में, हम सीखेंगे कि Rust में स्वच्छ कोड कैसे लिखें ताकि आपका प्रोजेक्ट unsafe ब्लॉक और उलझे हुए जेनेरिक्स की भूलभुलैया न बने। आप नामकरण के सिद्धांतों, स्वामित्व के मुहावरों, त्रुटि प्रबंधन और कोड संरचना के बारे में जानेंगे। चलिए शुरू करते हैं!

\n\n

1. नामकरण: Rust की भाषा में बोलें

\n\n

सही नामकरण आधी सफलता है। Rust में सख्त परंपराएं हैं, और उनका उल्लंघन कोड रिव्यू में लाल झंडा माना जाता है।

\n\n

मुख्य नियम

\n
    \n
  • वेरिएबल, फंक्शन, मेथड और मॉड्यूल के लिए snake_case।
  • \n
  • टाइप (struct, enum, trait) के लिए PascalCase।
  • \n
  • कॉन्स्टेंट और स्टैटिक वेरिएबल के लिए SCREAMING_SNAKE_CASE।
  • \n
\n\n

उदाहरण:

\n\n
// खराब\nlet UserName = "Alice";\nfn GetUserData() {}\nconst MAX_SIZE: u32 = 100;\n\n// अच्छा\nlet user_name = "Alice";\nfn get_user_data() {}\nconst MAX_SIZE: u32 = 100;
\n\n

संक्षिप्त नामों से बचें (जब तक स्पष्ट न हों)

\n

calc_avg() के बजाय calculate_average() लिखें। tmp के बजाय temp_buffer। Rust पठनीयता को प्रोत्साहित करता है, संक्षिप्तता को नहीं।

\n\n

सुझाव: यदि आप कोई फंक्शन लिख रहे हैं जो क्लोजर लेता है, तो f, g या closure नामों का उपयोग करें - यह सामान्य प्रथा है।

\n\n

2. स्वामित्व और उधार: कंपाइलर से दोस्ती करें

\n\n

स्वामित्व प्रणाली Rust का दिल है। स्वच्छ कोड ownership और borrowing के नियमों का सम्मान करता है, बिना ज़रूरत के clone() या Rc का उपयोग करने की कोशिश नहीं करता।

\n\n

नियम: स्वामित्व पर उधार को प्राथमिकता दें

\n

यदि फंक्शन को स्वामित्व लेने की ज़रूरत नहीं है, तो रेफरेंस &T या म्यूटेबल रेफरेंस &mut T लें।

\n\n
// खराब: अनावश्यक clone\nfn process(data: Vec<i32>) {\n    let mut sum = 0;\n    for &val in &data {\n        sum += val;\n    }\n    println!("Sum: {}", sum);\n}\n\n// अच्छा: उधार\nfn process(data: &[i32]) {\n    let mut sum = 0;\n    for &val in data {\n        sum += val;\n    }\n    println!("Sum: {}", sum);\n}
\n\n

अत्यधिक क्लोनिंग से बचें

\n

यदि आपको डेटा को कई स्थानों पर भेजना है, तो Rc (सिंगल-थ्रेड के लिए) या Arc (मल्टी-थ्रेड के लिए) का उपयोग करें। लेकिन इसका दुरुपयोग न करें: सरल मामलों के लिए रेफरेंस काफी हैं।

\n\n

3. त्रुटि प्रबंधन: पैनिक से बचें

\n\n

Rust में त्रुटियों को संभालने के दो मुख्य तरीके हैं: panic! (अपूरणीय त्रुटि) और Result<T, E> (पुनर्प्राप्त करने योग्य)। स्वच्छ कोड जहां संभव हो Result का उपयोग करता है। पैनिक केवल वास्तविक असाधारण स्थितियों (जैसे शून्य से भाग) के लिए अंतिम उपाय है।

\n\n

? ऑपरेटर का उपयोग करें

\n

यह त्रुटि को ऊपर भेजने का संक्षिप्त तरीका है। लंबे match के बजाय लिखें:

\n\n
use std::fs::File;\nuse std::io::Read;\n\nfn read_file(path: &str) -> Result<String, std::io::Error> {\n    let mut file = File::open(path)?;\n    let mut contents = String::new();\n    file.read_to_string(&mut contents)?;\n    Ok(contents)\n}
\n\n

अपने स्वयं के त्रुटि प्रकार बनाएं

\n

String को त्रुटि के रूप में उपयोग करने के बजाय, एक एनम परिभाषित करें:

\n\n
#[derive(Debug)]\nenum MyError {\n    Io(std::io::Error),\n    Parse(std::num::ParseIntError),\n}\n\nimpl From<std::io::Error> for My                

ब्लॉग

पुस्तक अनुशंसाएँ