रस्ट को pub और pub(super) दोनों के लिए समर्थन प्राप्त है। pub ऐसा बनाता है ताकि पैरेंट मॉड्यूल किसी आइटम तक पहुंच सके... और pub(super) भी ठीक यही काम करता प्रतीत होता है। मैंने नीचे दिए गए उदाहरण के साथ खेलने की कोशिश की है, और pub और pub(super) की अदला-बदली करने से कोई प्रभाव नहीं पड़ता है:

#![allow(dead_code)]

mod outer {
    pub(super) fn outer_foo() { inner::inner_foo(); }
    mod inner {
        pub(super) fn inner_foo() { println!("hello world!"); }
    }
}

fn top_level_foo() { outer::outer_foo(); }

आप कभी एक के ऊपर दूसरे का उपयोग क्यों करेंगे?

खेल का मैदान लिंक।

4
Joseph Garvin 17 जिंदा 2021, 06:28
2
संक्षेप में - यह मायने रखता है mod inner pub भी था। मेरे पास अभी तक उचित उत्तर के लिए समय नहीं है, लेकिन यही विचार है।
 – 
Cerberus
17 जिंदा 2021, 07:33
2
@Cerberus ने जो कहा, उसके बारे में विस्तार से बताते हुए, इससे फर्क पड़ेगा अगर inner pub है - या दूसरे शब्दों में, inner टोकरा के बाहर सहित, कहीं से भी पहुँचा जा सकता है। अगर inner_foo pub भी है, तो हर कोई (बाहरी क्रेट सहित) इसे एक्सेस कर पाएगा। हालांकि, inner_foo को pub(super) के रूप में चिह्नित करना सुनिश्चित करता है कि केवल पैरेंट/सुपर मॉड्यूल (outer) ही इसे एक्सेस कर सकते हैं, मॉड्यूल की दृश्यता की परवाह किए बिना (inner) जिसमें inner_foo.
 – 
EvilTak
17 जिंदा 2021, 08:20

1 उत्तर

सबसे बढ़िया उत्तर

आपके उदाहरण में, यदि आप अपने inner मॉड्यूल को सार्वजनिक करने के लिए बदलते हैं, तो अंतर स्पष्ट हो जाएगा।

उदाहरण के लिए, यह काम करता है क्योंकि outer::inner::inner_foo मुख्य मॉड्यूल से दिखाई देता है:

#![allow(dead_code)]

mod outer {
    pub(super) fn outer_foo() { inner::inner_foo(); }
    pub mod inner {
        pub fn inner_foo() { println!("hello world!"); }
    }
}

fn top_level_foo() { outer::outer_foo(); }

fn main() {
    outer::inner::inner_foo();
}

यदि आप inner_foo को pub(super) के रूप में रखते हैं तो यह केवल outer मॉड्यूल से दिखाई देता है (क्योंकि super सुपर-मॉड्यूल को संदर्भित करता है, outer में inner के अंदर कुछ का मामला), इसलिए उपरोक्त कोड संकलित नहीं होगा और आपको यह त्रुटि दिखाई देगी:

   |
13 |     outer::inner::inner_foo();
   |                   ^^^^^^^^^ private function
   |
note: the function `inner_foo` is defined here

ध्यान दें कि pub crate को तर्क के रूप में भी ले सकता है, जिससे समारोह को टोकरे के भीतर ही सार्वजनिक किया जा सकता है, लेकिन अन्य क्रेटों के लिए नहीं।

3
Renato 17 जिंदा 2021, 14:03
मैं यह कहकर संक्षेप में बताऊंगा कि pub(thing) का अर्थ है "इसे संलग्न मॉड्यूल के लिए सुलभ बनाएं, लेकिन इसे thing से परे मॉड्यूल को संलग्न करके संक्रमणीय रूप से पुन: प्रकट न होने दें"। तो यह सार्वजनिक रूप से ऊपरी सीमा के साथ है कि इसे कितनी दूर तक पुन: निर्यात किया जा सकता है।
 – 
Joseph Garvin
16 अगस्त 2021, 22:28