Rust 的 C++ Friend-like 构造

C++ Friend-like construct for Rust

在某些情况下,我想利用 Rust 中的任何替代方案来替代 C++ 的 friend 关键字。在板条箱 A 中,我有以下 mod 规则:

mod a0:

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

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

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

我通常会做这样的事情:

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.

这看起来很费解,我好像漏掉了什么。或者这是唯一的方法吗?

作为解决方法,可以制作一些东西 public,然后使用 #[doc(hidden)] 隐藏在文档中。隐藏位应该不是 API 等的一部分,而且通常人们不会使用它们,因为它们依赖于文档和示例。

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

  • pub(crate) 允许在当前 crate 中访问
  • pub(super) 也允许访问当前模块的父级
  • pub(in some_module) 允许来自 some_module
  • 的访问