Module 如何从私有模块中的公共函数引用私有类型?

Module 如何从私有模块中的公共函数引用私有类型?,module,rust,visibility,Module,Rust,Visibility,我想在一个文件中分组类似的函数。这些函数需要返回非公共的类型: struct MyStruct; mod my_mod { use super::MyStruct; // There are other, similar functions that also return `MyStruct` pub fn foo() -> MyStruct { MyStruct } } fn main() { let _var = my_m

我想在一个文件中分组类似的函数。这些函数需要返回非公共的类型:

struct MyStruct;

mod my_mod {
    use super::MyStruct;

    // There are other, similar functions that also return `MyStruct`
    pub fn foo() -> MyStruct {
        MyStruct
    }
}

fn main() {
    let _var = my_mod::foo();
}
此操作失败并出现错误

错误[E0446]:公共接口中的私有类型'MyStruct'
-->src/main.rs:7:3
|
1 | struct MyStruct;
|-`MyStruct`声明为私有
...
7 | pub fn foo()->MyStruct{MyStruct}
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^不能泄漏私有类型
一般来说,不允许公共函数在其签名中包含私有类型是有意义的,但在这种特定情况下,该结构在模块根级别可用


有没有一种方法可以在不公开MyStruct的情况下支持这一点?

我觉得这个错误是没有根据的。只有当
my_mod
pub
或函数在外部范围内重新导出时,才会出现错误

这就是说,我找到了一个解决方法:将
MyStruct
移动到同级模块,并将
MyStruct
发布,但不发布模块

use types::MyStruct;

mod types {
    pub struct MyStruct;
}

mod my_mod {
    use super::MyStruct;

    pub fn foo() -> MyStruct {
        MyStruct
    }
}

fn main() {
    let _var = my_mod::foo();
}

我遇到了同样的问题。似乎已经解决了这个问题;只需将子模块的“public”函数称为
pub(板条箱)
,即
pub(板条箱)fn foo()


这使得该函数只对板条箱公开:

它看起来确实像一个bug/限制,我发现它似乎也有同样的问题。