适用于Rust的C++ Friend-like构造

ust*_*ion 10 encapsulation rust

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

mod a0:

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

impl A {
    pub fn fa0(...) { ... }
    fn fa1(...) { ... }
}
Run Code Online (Sandbox Code Playgroud)

模块b0c0需要访问所有公共和私人成员A.代码不能这样做,除非它在mod a0.我只想暴露A,A::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
}
Run Code Online (Sandbox Code Playgroud)

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

mod a0;
mod b0;
mod c0;

pub use a0::A; // so other crates cannot use get_inner(...) etc.
Run Code Online (Sandbox Code Playgroud)

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

Isa*_*ods 9

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

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