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 build
consigo
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.rs
a:
#![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 hello
en suhello.rs
archivo. El código de cualquier archivo excepto la raíz de la caja (main.rs
para ejecutables,lib.rs
para bibliotecas) se coloca automáticamente en un espacio de nombres en un módulo.Para incluir el código de
hello.rs
en 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
use
es solo una cosa de espacio de nombres, mientras quemod
extrae el archivo. Utilizaríause
, por ejemplo, poder llamar a laprint_hello
funció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.rs
my.rs
Óxido 2015
Necesita poner un
mod.rs
archivo dentro de su carpeta con el mismo nombre que su módulo. Rust by Example lo explica mejor.main.rs
mod.rs
fuente
inaccessible.rs
ennested.rs
... ¿cómo iba a hacer eso?#[path = "inaccessible.rs"]
y en la siguiente línea:mod inaccessible;
mod inaccessible;
paramy/mod.rs
convertirlo en un submódulo demy
, luego accede al módulo hermano desde lanested.rs
ruta relativasuper::inaccessible::function()
. no necesitaspath
atributo 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
fn
con el mismo nombre que el archivo en el que estaba.#[path = "./add_offer.rs"] mod _add_offer; pub use self::_add_offer::add_offer;