2016-02-01 12 views
8

Rust to C++のfriendキーワードにある代替案を利用したい場合があります。C++ Rustのフレンド様のコンストラクタ

MOD A0

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

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

モジュールb0c0Aのすべてのパブリックとプライベートのメンバーにアクセスする必要がクレートで、私は以下のモジュールがあります。コードは、それがmod a0でない限り行うことはできません。 AA::a0A::fa0のみをこのクレートと接続する他のクレートに公開したいと思いますが、このクレート内でA(公開と非公開)の完全な実装にアクセスしたいと思います。 lib.rsに私がいる間、

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 
} 

モジュールb0c0アクセスget_innerので、Inner

MOD A0

私は通常のようなものをやって終わる

mod a0; 
mod b0; 
mod c0; 

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

これは非常に便利です私は何かが欠けているようだ。それともこれが唯一の方法ですか?

+4

まだありません。この問題を解決するには[RFC 1422](https://github.com/rust-lang/rfcs/pull/1422)までお待ちください。 –

+1

RFC 1422は、2016年3月21日に[承諾](https://github.com/rust-lang/rfcs/pull/1422#issuecomment-199443868)でした。 – malbarbo

答えて

0

回避策として、公開するものを作成してから、#[doc(hidden)]のドキュメントに隠すことができます。隠しビットはAPIの一部ではないと考えられています。一般的に、ドキュメントや例に依存しているため、人々は使用しません。

3

今やRFC 1422が受け入れられました。これは可能です!同様

  • pub(in some_module)some_module
  • からアクセスできるようにするには、現在のモジュールの親へのアクセスを許可するよう
  • pub(super)

    • pub(crate)は、現在のクレート内でのアクセスを許可する:あなたはして構造体の定義にpubを置き換えることができます
  • +0

    Ah brilliant ..試してみる – ustulation