【问题标题】:How to reference private types from public functions in private modules?如何从私有模块中的公共函数中引用私有类型?
【发布时间】:2019-09-13 05:29:13
【问题描述】:

我想将类似的函数分组到一个文件中。这些函数需要返回一个不公开的类型:

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

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

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

【问题讨论】:

    标签: module rust visibility


    【解决方案1】:

    我觉得这个错误是没有根据的。仅当 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();
    }
    

    【讨论】:

    【解决方案2】:

    我遇到了同样的问题。 Rust 2018 似乎已经解决了它;只需将子模块的“公共”功能称为pub(crate),AKA pub(crate) fn foo()

    这使得函数只对 crate 公开:https://doc.rust-lang.org/nightly/edition-guide/rust-2018/module-system/more-visibility-modifiers.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-18
      • 1970-01-01
      • 2018-11-18
      • 2015-12-27
      • 2012-11-10
      • 2015-04-02
      相关资源
      最近更新 更多