2016-02-01 5 views
8

In bestimmten Fällen möchte ich jede Alternative nutzen, die in Rust zu C++ friend Schlüsselwort ist. In Kiste A Ich habe folgende Module:C++ Friend-like construct für Rust

mod a0:

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

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

Module b0 und c0 brauchen Zugang zu allen öffentlichen und privaten Mitgliedern A. Code kann das nicht tun, es sei denn, es ist in mod a0. Ich möchte nur A, A::a0 und A::fa0 anderen Kisten zugänglich machen, die mit dieser Kiste verbunden sind, aber innerhalb dieser Kiste möchte ich Zugriff auf die vollständige Implementierung von A (öffentlich und privat) haben.

ich am Ende in der Regel etwas zu tun, wie:

mod 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 
} 

Module b0 und c0 Zugang get_inner und damit Inner, während in lib.rs ich tun:

mod a0; 
mod b0; 
mod c0; 

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

Das scheint sehr conv oluted und ich vermisse etwas. Oder ist das der einzige Weg, es zu tun?

+4

Noch nicht möglich. Warten Sie auf [RFC 1422] (https://github.com/rust-lang/rfcs/pull/1422), um dieses Problem zu lösen. –

+1

Die RFC 1422 wurde am 21. März 2016 [akzeptieren] (https://github.com/rust-lang/rfcs/pull/1422#issuecomment-199443868). – malbarbo

Antwort

0

Als Workaround ist es möglich, etwas öffentlich zu machen und dann in der Dokumentation mit #[doc(hidden)] zu verstecken. Versteckte Bits sollen nicht Teil der API usw. sein, und im Allgemeinen werden Leute sie sowieso nicht verwenden, da sie auf Dokumenten und Beispielen beruhen.

3

Jetzt RFC 1422 akzeptiert wurde, ist dies möglich! Sie können mit pub in Strukturdefinitionen ersetzen:

  • pub(crate) Zugriff innerhalb der aktuellen Kiste zu ermöglichen
  • pub(super) Zugriff auf das aktuelle Modul der Eltern zu ermöglichen, als auch
  • pub(in some_module) um den Zugriff von some_module
+0

Ah brilliant .. wird es ausprobieren – ustulation