Siguiendo esta guía creé un proyecto Cargo.
src/main.rs
fn main() {
hello::print_hello();
}
mod hello {
pub fn print_hello() {
println!("Hello, world!");
}
}
que corro usando
cargo build && cargo run
y se compila sin errores. Ahora estoy tratando de dividir el módulo principal en dos, pero no puedo averiguar cómo incluir un módulo de otro archivo.
Mi árbol de proyectos se ve así
├── src
├── hello.rs
└── main.rs
y el contenido de los archivos:
src/main.rs
use hello;
fn main() {
hello::print_hello();
}
src/hello.rs
mod hello {
pub fn print_hello() {
println!("Hello, world!");
}
}
Cuando lo compilo cargo buildconsigo
error[E0432]: unresolved import `hello`
--> src/main.rs:1:5
|
1 | use hello;
| ^^^^^ no `hello` external crate
Intenté seguir las sugerencias del compilador y modifiqué main.rsa:
#![feature(globs)]
extern crate hello;
use hello::*;
fn main() {
hello::print_hello();
}
Pero esto todavía no ayuda mucho, ahora entiendo esto:
error[E0463]: can't find crate for `hello`
--> src/main.rs:3:1
|
3 | extern crate hello;
| ^^^^^^^^^^^^^^^^^^^ can't find crate
¿Existe un ejemplo trivial de cómo incluir un módulo del proyecto actual en el archivo principal del proyecto?

Respuestas:
No necesita el
mod helloen suhello.rsarchivo. El código de cualquier archivo excepto la raíz de la caja (main.rspara ejecutables,lib.rspara bibliotecas) se coloca automáticamente en un espacio de nombres en un módulo.Para incluir el código de
hello.rsen sumain.rs, usemod hello;. Se expande al código que está enhello.rs(exactamente como lo tenía antes). La estructura de su archivo sigue igual y su código debe cambiarse ligeramente:main.rs:hello.rs:fuente
usees solo una cosa de espacio de nombres, mientras quemodextrae el archivo. Utilizaríause, por ejemplo, poder llamar a laprint_hellofunción sin tener que prefijar el espacio de nombresSi desea tener módulos anidados ...
Óxido 2018
Ya no es necesario tener el archivo
mod.rs(aunque todavía es compatible). La alternativa idiomática es nombrar el archivo con el nombre del módulo:main.rsmy.rsÓxido 2015
Necesita poner un
mod.rsarchivo dentro de su carpeta con el mismo nombre que su módulo. Rust by Example lo explica mejor.main.rsmod.rsfuente
inaccessible.rsennested.rs... ¿cómo iba a hacer eso?#[path = "inaccessible.rs"]y en la siguiente línea:mod inaccessible;mod inaccessible;paramy/mod.rsconvertirlo en un submódulo demy, luego accede al módulo hermano desde lanested.rsruta relativasuper::inaccessible::function(). no necesitaspathatributo aquí.Realmente me gusta la respuesta de Gardener. He estado usando la sugerencia para las declaraciones de mi módulo. Alguien por favor intervenga si hay un problema técnico con esto.
main.rs
utils / thing.rs
other_utils / other_thing.rs
fuente
fncon el mismo nombre que el archivo en el que estaba.#[path = "./add_offer.rs"] mod _add_offer; pub use self::_add_offer::add_offer;