Rust的{C ++ Friend-like结构

时间:2016-02-01 23:17:52

标签: rust encapsulation

在某些情况下,我想利用Rust中的任何替代方法来解决C ++的friend关键字。在箱子里 A 我有以下模块:

mod a0

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

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

模块b0c0需要访问A的所有公共和私有成员。代码不能这样做,除非它在mod a0中。我只想将AA::a0A::fa0公开给与此包装箱接口的其他包装箱,但在此包装箱内,我希望能够访问A的完整实施(公共和私有的)。

我通常会做类似的事情:

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
}

模块b0c0访问get_inner,因此访问Inner,而lib.rs我这样做:

mod a0;
mod b0;
mod c0;

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

这看起来很复杂,我似乎错过了一些东西。或者这是唯一的方法吗?

2 个答案:

答案 0 :(得分:7)

现在RFC 1422已被接受,这是可能的!您可以将结构定义中的pub替换为:

  • pub(crate)允许在当前包内进行访问
  • pub(super)允许访问当前模块的父级
  • pub(in some_module)允许some_module
  • 访问

答案 1 :(得分:0)

作为一种解决方法,可以将某些内容公开,然后使用django-summernote隐藏文档。隐藏的比特应该不是API等的一部分,并且通常人们无论如何都不会使用它们,因为它们依赖于文档和示例。