【问题标题】:C++ Friend-like construct for RustRust 的 C++ Friend-like 构造
【发布时间】:2016-05-10 14:21:37
【问题描述】:

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

mod a0:

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

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

模块b0 和c0 需要访问A 的所有公共和私人成员。代码不能这样做,除非它在 ​​mod a0 中。我只想将A、A::a0 和A::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
}

模块 b0 和 c0 访问 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解决此问题。
  • RFC 1422 于 2016 年 3 月 21 日为 accept。

标签: rust encapsulation


【解决方案1】:

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

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

【讨论】:

  • 啊太棒了..会尝试
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2015-07-05
    • 2018-01-14
    • 2011-01-02
    • 1970-01-01
    相关资源
    最近更新 更多