我想将类似的函数分组在一个文件中。这些函数需要返回一个非公开的类型:
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
一般来说,不允许公共函数在其签名中具有私有类型是有意义的,但在这种特定情况下,结构is在模块根级别可用。
有没有一种方法可以支持这一点而不需要MyStruct
public?
我感觉这个错误是没有根据的。只有在以下情况下才应该是一个错误:my_mod
is pub
或者如果函数在外部作用域中重新导出。
也就是说,我找到了一个解决方法:移动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();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)