2016-02-01 22 views
8

Trong một số trường hợp, tôi muốn tận dụng bất kỳ phương án thay thế nào trong từ khóa friend của Rust to C++. Trong thùng Một tôi có các bộ phận sau:C++ Cấu trúc giống như bạn bè cho Rust

mod a0:

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

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

Modules b0c0 cần truy cập vào tất cả các thành viên công cộng và tư nhân của A. Mã không thể làm điều đó trừ khi nó nằm trong mod a0. Tôi chỉ muốn để lộ A, A::a0A::fa0 cho các thùng khác giao tiếp với thùng này, nhưng trong thùng này tôi muốn truy cập vào việc triển khai hoàn chỉnh A (công khai và riêng tư).

tôi thường kết thúc làm một cái gì đó như:

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 
} 

Modules b0c0 truy cập get_inner và do đó Inner, trong khi ở lib.rs tôi làm:

mod a0; 
mod b0; 
mod c0; 

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

Điều này có vẻ rất chuyển đổi oluted và tôi dường như thiếu một cái gì đó. Hay đây là cách duy nhất để làm điều đó?

+4

Chưa thể. Đợi [RFC 1422] (https://github.com/rust-lang/rfcs/pull/1422) để giải quyết vấn đề này. –

+1

RFC 1422 đã được [chấp nhận] (https://github.com/rust-lang/rfcs/pull/1422#issuecomment-199443868) vào ngày 21 tháng 3 năm 2016. – malbarbo

Trả lời

0

Giải pháp thay thế, có thể đặt nội dung nào đó ở chế độ công khai và sau đó ẩn trong tài liệu với #[doc(hidden)]. Các bit ẩn được cho là không phải là một phần của API, v.v. và thường thì mọi người sẽ không sử dụng chúng vì chúng dựa vào tài liệu và ví dụ.

3

Bây giờ RFC 1422 đã được chấp nhận, điều này là có thể! Bạn có thể thay pub trong định nghĩa cấu trúc với:

  • pub(crate) cho phép truy cập trong thùng hiện
  • pub(super) cho phép truy cập đến cha mẹ các module hiện tại cũng
  • pub(in some_module) cho phép truy cập từ some_module
+0

Ah rực rỡ .. sẽ thử – ustulation

Các vấn đề liên quan