如何从私有模块中的 public 函数引用私有类型?
How to reference private types from public functions in private modules?
我想将相似的函数分组到一个文件中。这些函数需要 return 不是 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 函数在其签名中具有私有类型是有意义的,但在这种特定情况下,结构 在模块中可用 根级别。
有没有办法在不使 MyStruct
public 的情况下支持这个?
我觉得这个错误是没有根据的。如果 my_mod
是 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();
}
我遇到了同样的问题。 Rust 2018 似乎已经解决了;只需将子模块的 "public" 函数称为 pub(crate)
,即 pub(crate) fn foo()
.
这使得函数只 public 到板条箱:https://doc.rust-lang.org/nightly/edition-guide/rust-2018/module-system/more-visibility-modifiers.html
我想将相似的函数分组到一个文件中。这些函数需要 return 不是 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 函数在其签名中具有私有类型是有意义的,但在这种特定情况下,结构 在模块中可用 根级别。
有没有办法在不使 MyStruct
public 的情况下支持这个?
我觉得这个错误是没有根据的。如果 my_mod
是 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();
}
我遇到了同样的问题。 Rust 2018 似乎已经解决了;只需将子模块的 "public" 函数称为 pub(crate)
,即 pub(crate) fn foo()
.
这使得函数只 public 到板条箱:https://doc.rust-lang.org/nightly/edition-guide/rust-2018/module-system/more-visibility-modifiers.html