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(...) { ... }
}
模块 b0
和 c0
需要访问所有 public 和 A
的私有成员。代码不能这样做,除非它在 mod a0
中。我只想将 A
、A::a0
和 A::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
}
模块 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.
这看起来很费解,我好像漏掉了什么。或者这是唯一的方法吗?
作为解决方法,可以制作一些东西 public,然后使用 #[doc(hidden)]
隐藏在文档中。隐藏位应该不是 API 等的一部分,而且通常人们不会使用它们,因为它们依赖于文档和示例。
现在RFC 1422已经接受了,这是可以的!您可以将结构定义中的 pub
替换为:
pub(crate)
允许在当前 crate 中访问
pub(super)
也允许访问当前模块的父级
pub(in some_module)
允许来自 some_module
的访问
在某些情况下,我想利用 Rust 中的任何替代方案来替代 C++ 的 friend
关键字。在板条箱 A 中,我有以下 mod 规则:
mod a0:
pub struct A {
pub a0: u8,
a1: SomeType,
}
impl A {
pub fn fa0(...) { ... }
fn fa1(...) { ... }
}
模块 b0
和 c0
需要访问所有 public 和 A
的私有成员。代码不能这样做,除非它在 mod a0
中。我只想将 A
、A::a0
和 A::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
}
模块 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.
这看起来很费解,我好像漏掉了什么。或者这是唯一的方法吗?
作为解决方法,可以制作一些东西 public,然后使用 #[doc(hidden)]
隐藏在文档中。隐藏位应该不是 API 等的一部分,而且通常人们不会使用它们,因为它们依赖于文档和示例。
现在RFC 1422已经接受了,这是可以的!您可以将结构定义中的 pub
替换为:
pub(crate)
允许在当前 crate 中访问pub(super)
也允许访问当前模块的父级pub(in some_module)
允许来自some_module
的访问