module - 如何从私有(private)模块中的公共(public)函数引用私有(private)类型?

标签 module rust visibility

我想将相似的函数组合到一个文件中。这些函数需要返回一个非公共(public)类型:

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();
}

失败并出现错误

error[E0446]: private type `MyStruct` in public interface
 --> src/main.rs:7:3
  |
1 |     struct MyStruct;
  |     - `MyStruct` declared as private
...
7 |         pub fn foo() -> MyStruct { MyStruct }
  |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can't leak private type

一般来说,不允许公共(public)函数在其签名中包含私有(private)类型是有意义的,但在这种特定情况下,结构在模块根级别可用。

有没有办法在不公开 MyStruct 的情况下支持这一点?

最佳答案

我觉得这个错误是没有根据的。只有当 my_modpub 或函数在外部作用域中重新导出时,它才应该是一个错误。

也就是说,我找到了一个解决方法:将 MyStruct 移动到兄弟模块并使 MyStruct 成为 pub,但不是模块。

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();
}

关于module - 如何从私有(private)模块中的公共(public)函数引用私有(private)类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55821205/

相关文章:

css - React - 使用 CSS 模块将 **active** 类应用于元素

rust - 有没有一种方法可以编写泛型函数,从而在rust中通过数组扩展实体?

c# - 从 C# 代码动态切换 WPF 网格列的可见性

java - 设置按钮可见

javascript - 在函数中使用查询到的json数据

php - Phalcon 从不同模块中的 Controller 查询模型

module - 两个模块,都导出相同的名称

Perl - 所有包含的脚本和模块中都可用的全局变量?

asynchronous - 异步 channel 无法停止

rust - 如何在类型上而不是在类型内部使用自定义命名空间派生宏属性?