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

mod a0:

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

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

模块b0c0需要访问A的所有公共和私有成员.代码不能这样做,除非它在mod a0中.我只想将AA::a0A::fa0expose 在与这个 crate 连接的其他 crate 中,但在这个 crate 中,我想访问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.

这似乎很复杂,我似乎遗漏了一些东西.还是这是唯一的方法?

推荐答案

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

  • pub(crate)以允许进入当前 crate
  • pub(super)以允许访问当前模块的父级
  • pub(in some_module)允许从some_module进入

Rust相关问答推荐

为什么迭代器上的`. map(...)`的返回类型如此复杂?

泛型属性比较

收集RangeInclusive T到Vec T<><>

为什么Rust函数的移植速度比C++慢2倍?

为什么实例方法可以像Rust中的静态方法一样被调用?

有没有办法在Rust中配置常量变量的值?

如何格式化传入Rust中mysql crate的Pool::new的字符串

从Type::new()调用函数

为什么实现特征的对象期望比具体对象有更长的生命周期?

如何将 struct 数组放置在另一个 struct 的末尾而不进行内存分段

这个不安全的 Rust 代码有什么问题,所以它可以在 Windows 上运行,但不能在 Ubuntu 上运行?

`use` 和 `crate` 关键字在 Rust 项目中效果不佳

没有得到无法返回引用局部变量`queues`的值返回引用当前函数拥有的数据的值的重复逻辑

如何连接 Rust 中的相邻切片

&str 的编译时拆分是否可能?

为什么在 rust 中删除 vec 之前应该删除元素

改变不实现克隆的 dioxus UseState struct

用逗号分隔字符串,但在标记中使用逗号

如何阅读 HttpRequest 主体

来自外部函数的future 内部可变引用