Rollup merge of #73351 - gnodarse:patch-1, r=ecstatic-morse
Update E0446.md The existing error documentation did not show how to use a child module's functions if the types used in those functions are private. These are some other places this problem has popped up that did not present a solution (these are from before the solution existed, 2016-2017. The solution was released in the Rust 2018 edition. However these were the places I was pointed to when I encountered the problem myself): https://github.com/rust-lang/rust/issues/30905 https://stackoverflow.com/questions/39334430/how-to-reference-private-types-from-public-functions-in-private-modules/62374958#62374958
This commit is contained in:
commit
192e9bde80
@ -4,10 +4,10 @@ Erroneous code example:
|
|||||||
|
|
||||||
```compile_fail,E0446
|
```compile_fail,E0446
|
||||||
#![deny(private_in_public)]
|
#![deny(private_in_public)]
|
||||||
|
struct Bar(u32);
|
||||||
|
|
||||||
mod Foo {
|
mod foo {
|
||||||
struct Bar(u32);
|
use crate::Bar;
|
||||||
|
|
||||||
pub fn bar() -> Bar { // error: private type in public interface
|
pub fn bar() -> Bar { // error: private type in public interface
|
||||||
Bar(0)
|
Bar(0)
|
||||||
}
|
}
|
||||||
@ -16,15 +16,31 @@ mod Foo {
|
|||||||
fn main() {}
|
fn main() {}
|
||||||
```
|
```
|
||||||
|
|
||||||
To solve this error, please ensure that the type is also public. The type
|
There are two ways to solve this error. The first is to make the public type
|
||||||
can be made inaccessible if necessary by placing it into a private inner
|
signature only public to a module that also has access to the private type.
|
||||||
module, but it still has to be marked with `pub`.
|
This is done by using pub(crate) or pub(in crate::my_mod::etc)
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
```
|
```
|
||||||
mod Foo {
|
struct Bar(u32);
|
||||||
pub struct Bar(u32); // we set the Bar type public
|
|
||||||
|
|
||||||
|
mod foo {
|
||||||
|
use crate::Bar;
|
||||||
|
pub(crate) fn bar() -> Bar { // only public to crate root
|
||||||
|
Bar(0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
||||||
|
```
|
||||||
|
|
||||||
|
The other way to solve this error is to make the private type public.
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```
|
||||||
|
pub struct Bar(u32); // we set the Bar type public
|
||||||
|
mod foo {
|
||||||
|
use crate::Bar;
|
||||||
pub fn bar() -> Bar { // ok!
|
pub fn bar() -> Bar { // ok!
|
||||||
Bar(0)
|
Bar(0)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user