2016-02-01 14 views
8

W niektórych przypadkach chciałbym wykorzystać dowolną alternatywę słowa kluczowego Rust na C++: friend. W skrzyni Mam następujące moduły:C++ Konstrukcja podobna do znajomego dla Rust

mod A0:

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

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

Moduły b0 i c0 potrzebują dostępu do wszystkich członków publicznych i prywatnych A. Kod nie może tego zrobić, chyba że jest w mod a0. Chcę udostępnić tylko A, A::a0 i A::fa0 innym skrzynkom współpracującym z tą skrzynką, ale w tej skrzynce chcę mieć dostęp do pełnej implementacji A (publicznych i prywatnych).

I zazwyczaj kończy się robi coś takiego:

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 
} 

Moduły b0 i c0 dostępu get_inner i stąd Inner, natomiast w lib.rs zrobić:

mod a0; 
mod b0; 
mod c0; 

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

To wydaje się bardzo conv oszołomiony i wydaje mi się, że czegoś mi brakuje. A może to jedyny sposób na zrobienie tego?

+4

Nie jest jeszcze możliwe. Poczekaj na [RFC 1422] (https://github.com/rust-lang/rfcs/pull/1422), aby rozwiązać ten problem. –

+1

Model RFC 1422 został [zaakceptuj] (https://github.com/rust-lang/rfcs/pull/1422#issuecomment-199443868) w dniu 21 marca 2016 r. – malbarbo

Odpowiedz

0

Aby obejść ten problem, można zrobić coś publicznego, a następnie ukryć się przed dokumentacją za pomocą #[doc(hidden)]. Ukryte bity nie powinny być częścią API itp. I ogólnie ludzie nie będą ich używać, ponieważ polegają na dokumentach i przykładach.

3

Teraz RFC 1422 został zaakceptowany, jest to możliwe! Można zastąpić pub w definicji struktury z:

  • pub(crate) aby umożliwić dostęp obrębie bieżącego skrzyni
  • pub(super) aby umożliwić dostęp do rodzica bieżącego modułu, jak również
  • pub(in some_module) aby umożliwić dostęp z some_module
+0

Ah genialny .. wypróbuje – ustulation

Powiązane problemy