【发布时间】:2018-11-18 02:50:15
【问题描述】:
在下面的示例中,模块outer 有一个私有类型Private 和一个私有内部模块inner。 inner 能够访问 Private(因为子模块可以访问其父级的私有项目,即使它们没有作为公共停放)。
inner 定义了一个函数not_really_public_interface()。虽然它被标记为公开,它实际上只对outer 可用,因为inner 本身不公开。
outer.rs
struct Private;
mod inner {
use super::Private;
pub fn not_really_public_interface() -> Private {
Private
}
}
这编译没有任何问题。
outer应该可以使用inner::not_really_public_interface()获取Private,只要保证不导出即可。所以让我们这样做:
pub fn main() {
let _ = self::inner::not_really_public_interface();
}
对吗?
标准错误
error[E0446]: private type `Private` in public interface
--> src/outer.rs:4:3
|
4 | / pub fn not_really_public_interface() -> Private {
5 | | Private
6 | | }
| |___^ can't leak private type
Wat. 这对我来说是违反直觉的,原因如下:
- 即使前面的代码定义了一个带有 Rust 认为“泄漏”的接口的函数,它也不会产生错误。该错误仅在
outer尝试使用此功能时发生。 -
inner唯一可能“泄露”Private的地方是定义它的模块。
所以我的问题是:
- 到底发生了什么导致 Rust 断定该接口的任何部分都泄漏了?似乎它将
Private视为在inner中定义。 - 是否存在完全合理的上下文?我的第一个想法是这是编译器中的错误或隐私设计中的疏忽,但我怀疑情况是否如此。
- 有没有办法在不创建另一个模块的情况下解决这个问题?我相信我可以创建一个包装模块,然后在
outer和inner中公开Private,但我不想这样做。
【问题讨论】:
-
当我尝试编译您建议的代码时,即使不使用
not_really_public_interface我也会遇到同样的错误。这是playground。
标签: module interface rust private public