我想在文件中对类似的功能进行分组。这些函数需要返回一个不公开的类型:
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
的情况下支持这一点?
答案 0 :(得分:8)
我觉得这个错误是没有根据的。如果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();
}
答案 1 :(得分:0)
我遇到了同样的问题。 Rust 2018似乎已经解决了;只需将子模块的“公共”函数称为pub(crate)
,也称为pub(crate) fn foo()
。
这使该功能仅对板条箱公开:https://doc.rust-lang.org/nightly/edition-guide/rust-2018/module-system/more-visibility-modifiers.html