Avatar ·

Rust में स्वचालित डीरेफरेंसिंग (auto-dereferencing) के सटीक नियम क्या हैं?

सभी को नमस्कार! मैंने हाल ही में Rust सीखना शुरू किया है और मैं लगातार भ्रमित हो जाता हूँ कि कब और कैसे कंपाइलर स्वचालित रूप से संदर्भों को डीरेफरेंस करता है। उदाहरण के लिए, मैं देखता हूँ कि `&String` पर `len()` मेथड को कॉल किया जा सकता है, जबकि `len()` `String` के लिए परिभाषित है। या फिर `&i32` को उस फंक्शन में पास किया जा सकता है जो `i32` की अपेक्षा करता है, और Rust इसे स्वयं डीरेफरेंस कर देता है? यहाँ कुछ उदाहरण हैं जो मुझे भ्रमित करते हैं: ```rust fn main() { let s = String::from("hello"); let r = &s; println!("{}", r.len()); // काम करता है! लेकिन r एक &String है, String नहीं let x = 5; let y = &x; let z = *y; // यहाँ मैं समझता हूँ — स्पष्ट रूप से डीरेफरेंस करना होगा println!("{}", z); // और यहाँ — यह क्यों काम करता है? let v = vec![1, 2, 3]; let v_ref = &v; println!("{}", v_ref[0]); // v_ref एक &Vec है, लेकिन हम इंडेक्सिंग का उपयोग कर रहे हैं } ``` मैंने `Deref` और `DerefMut` ट्रेट्स के बारे में पढ़ा है, लेकिन मैं पूरी तरह से नहीं समझता कि कंपाइलर कैसे तय करता है कि स्वचालित डीरेफरेंसिंग कब लागू करनी है। क्या नियमों का कोई स्पष्ट सेट है? और क्यों कुछ मामलों में यह काम करता है जबकि दूसरों में नहीं?