mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-16 17:03:35 +00:00
auto merge of #9398 : Kimundi/rust/work1, r=huonw
This commit is contained in:
commit
5b6ef09046
@ -2420,7 +2420,8 @@ However, in practice you usually want to split you code up into multiple source
|
|||||||
In order to do that, Rust allows you to move the body of any module into it's own source file, which works like this:
|
In order to do that, Rust allows you to move the body of any module into it's own source file, which works like this:
|
||||||
|
|
||||||
If you declare a module without its body, like `mod foo;`, the compiler will look for the
|
If you declare a module without its body, like `mod foo;`, the compiler will look for the
|
||||||
files `foo.rs` and `foo/mod.rs`. If it finds either, it uses the content of that file as the body of the module.
|
files `foo.rs` and `foo/mod.rs` inside some directory (usually the same as of the source file containing
|
||||||
|
the `mod foo;`). If it finds either, it uses the content of that file as the body of the module.
|
||||||
If it finds both, that's a compile error.
|
If it finds both, that's a compile error.
|
||||||
|
|
||||||
So, if we want to move the content of `mod farm` into it's own file, it would look like this:
|
So, if we want to move the content of `mod farm` into it's own file, it would look like this:
|
||||||
@ -2446,7 +2447,7 @@ pub mod barn {
|
|||||||
# fn main() { }
|
# fn main() { }
|
||||||
~~~~
|
~~~~
|
||||||
|
|
||||||
So, in short `mod foo;` is just syntactic sugar for `mod foo { /* include content of foo.rs or foo/mod.rs here */ }`.
|
In short, `mod foo;` is just syntactic sugar for `mod foo { /* content of <...>/foo.rs or <...>/foo/mod.rs */ }`.
|
||||||
|
|
||||||
This also means that having two or more identical `mod foo;` somewhere
|
This also means that having two or more identical `mod foo;` somewhere
|
||||||
in your crate hierarchy is generally a bad idea,
|
in your crate hierarchy is generally a bad idea,
|
||||||
@ -2455,14 +2456,14 @@ Both will result in duplicate and mutually incompatible definitions.
|
|||||||
|
|
||||||
The directory the compiler looks in for those two files is determined by starting with
|
The directory the compiler looks in for those two files is determined by starting with
|
||||||
the same directory as the source file that contains the `mod foo;` declaration, and concatenating to that a
|
the same directory as the source file that contains the `mod foo;` declaration, and concatenating to that a
|
||||||
path equivalent to the relative path of all nested `mod { ... }` declarations the `mod foo;` is contained in, if any.
|
path equivalent to the relative path of all nested `mod { ... }` declarations the `mod foo;`
|
||||||
|
is contained in, if any.
|
||||||
|
|
||||||
For example, given a file with this module body:
|
For example, given a file with this module body:
|
||||||
|
|
||||||
~~~ {.ignore}
|
~~~ {.ignore}
|
||||||
// src/main.rs
|
// src/main.rs
|
||||||
mod plants;
|
mod plants;
|
||||||
mod fungi;
|
|
||||||
mod animals {
|
mod animals {
|
||||||
mod fish;
|
mod fish;
|
||||||
mod mammals {
|
mod mammals {
|
||||||
@ -2477,9 +2478,6 @@ The compiler would then try all these files:
|
|||||||
src/plants.rs
|
src/plants.rs
|
||||||
src/plants/mod.rs
|
src/plants/mod.rs
|
||||||
|
|
||||||
src/fungi.rs
|
|
||||||
src/fungi/mod.rs
|
|
||||||
|
|
||||||
src/animals/fish.rs
|
src/animals/fish.rs
|
||||||
src/animals/fish/mod.rs
|
src/animals/fish/mod.rs
|
||||||
|
|
||||||
@ -2487,15 +2485,54 @@ src/animals/mammals/humans.rs
|
|||||||
src/animals/mammals/humans/mod.rs
|
src/animals/mammals/humans/mod.rs
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
These rules per default result in any directory structure mirroring
|
Keep in mind that identical module hierachies can still lead to different path lookups
|
||||||
the crates's module hierarchy, and allow you to have both small modules that only need
|
depending on how and where you've moved a module body to its own file.
|
||||||
to consist of one source file, and big modules that group the source files of submodules together.
|
For example, if we move the `animals` module above into its own file...
|
||||||
|
|
||||||
If you need to circumvent those defaults, you can also overwrite the path a `mod foo;` would take:
|
|
||||||
|
|
||||||
~~~ {.ignore}
|
~~~ {.ignore}
|
||||||
#[path="../../area51/classified.rs"]
|
// src/main.rs
|
||||||
mod alien;
|
mod plants;
|
||||||
|
mod animals;
|
||||||
|
~~~
|
||||||
|
~~~ {.ignore}
|
||||||
|
// src/animals.rs or src/animals/mod.rs
|
||||||
|
mod fish;
|
||||||
|
mod mammals {
|
||||||
|
mod humans;
|
||||||
|
}
|
||||||
|
~~~
|
||||||
|
...then the source files of `mod animals`'s submodules can
|
||||||
|
either be placed right next to that of its parents, or in a subdirectory if `animals` source file is:
|
||||||
|
|
||||||
|
~~~ {.notrust}
|
||||||
|
src/plants.rs
|
||||||
|
src/plants/mod.rs
|
||||||
|
|
||||||
|
src/animals.rs - if file sits next to that of parent module's:
|
||||||
|
src/fish.rs
|
||||||
|
src/fish/mod.rs
|
||||||
|
|
||||||
|
src/mammals/humans.rs
|
||||||
|
src/mammals/humans/mod.rs
|
||||||
|
|
||||||
|
src/animals/mod.rs - if file is in it's own subdirectory:
|
||||||
|
src/animals/fish.rs
|
||||||
|
src/animals/fish/mod.rs
|
||||||
|
|
||||||
|
src/animals/mammals/humans.rs
|
||||||
|
src/animals/mammals/humans/mod.rs
|
||||||
|
|
||||||
|
~~~
|
||||||
|
|
||||||
|
These rules allow you to have both small modules that only need
|
||||||
|
to consist of one source file each and can be conveniently placed right next to each other,
|
||||||
|
and big complicated modules that group the source files of submodules in subdirectories.
|
||||||
|
|
||||||
|
If you need to circumvent the defaults, you can also overwrite the path a `mod foo;` would take:
|
||||||
|
|
||||||
|
~~~ {.ignore}
|
||||||
|
#[path="../../area51/alien.rs"]
|
||||||
|
mod classified;
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
## Importing names into the local scope
|
## Importing names into the local scope
|
||||||
|
Loading…
Reference in New Issue
Block a user