2016-02-01 10 views
8

कुछ मामलों में मैं जंग से सी ++ के friend कीवर्ड में जो भी विकल्प लेता हूं, उसका लाभ उठाना चाहता हूं।सी ++ जंग के लिए मित्र-जैसे निर्माण

आधुनिक a0:

pub struct A { 
    pub a0: u8, 
    a1: SomeType, 
} 

impl A { 
    pub fn fa0(...) { ... } 
    fn fa1(...) { ... } 
} 

मॉड्यूल b0 और c0A के सभी सार्वजनिक और निजी सदस्यों के लिए उपयोग की जरूरत है टोकरा एक में मैं निम्नलिखित मॉड्यूल है। कोड तब तक नहीं कर सकता जब तक कि यह mod a0 में न हो। मैं इस क्रेट के साथ इंटरफेसिंग करने वाले अन्य क्रेट्स के लिए केवल A, A::a0 और A::fa0 का खुलासा करना चाहता हूं, लेकिन इस क्रेट के भीतर मैं A (सार्वजनिक और निजी) के पूर्ण कार्यान्वयन तक पहुंच चाहता हूं।

आधुनिक a0:

मैं आमतौर पर की तरह कुछ कर रही अंत

pub struct A { 
    pub a0: u8, 
    inner: Inner 
} 

pub struct Inner { /* all pub fields */ } 

pub fn get_inner<'a>(obj: &'a mut A) -> &'a Inner { 
    &mut obj.inner 
} 

मॉड्यूल b0 और c0 पहुँच get_inner और इसलिए Inner, जबकि lib.rs में मुझे क्या करना:

mod a0; 
mod b0; 
mod c0; 

pub use a0::A; // so other crates cannot use get_inner(...) etc. 

यह बहुत दृढ़ लगता है oluted और मुझे कुछ याद आ रही है। या यह ऐसा करने का एकमात्र तरीका है?

+4

अभी तक संभव नहीं है। इस समस्या को हल करने के लिए [आरएफसी 1422] (https://github.com/rust-lang/rfcs/pull/1422) के लिए प्रतीक्षा करें। –

+1

21 मार्च 2016 को आरएफसी 1422 [स्वीकार] (https://github.com/rust-lang/rfcs/pull/1422#issuecomment-199443868) था। – malbarbo

उत्तर

0

कामकाज के रूप में, कुछ सार्वजनिक करना संभव है, और फिर #[doc(hidden)] के साथ दस्तावेज़ से छिपाना संभव है। छिपे बिट्स को एपीआई, आदि का हिस्सा नहीं माना जाता है और आम तौर पर लोग डॉक्स और उदाहरणों पर भरोसा करते हैं, वैसे भी लोग उनका उपयोग नहीं करेंगे।

3

अब RFC 1422 स्वीकार कर लिया गया है, यह संभव है!

  • pub(super) रूप में अच्छी तरह
  • pub(in some_module)some_module
  • से उपयोग की अनुमति वर्तमान मॉड्यूल के माता-पिता के लिए उपयोग की अनुमति के लिए

    • pub(crate) वर्तमान टोकरा भीतर उपयोग की अनुमति: आप के साथ संरचना परिभाषा में pub जगह ले सकता है
    +0

    आह शानदार .. कोशिश करेगा – ustulation