¿Cómo puedo incluir un módulo de otro archivo del mismo proyecto?
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 intentando dividir el módulo principal en dos, pero no sé 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 me cargo build
sale
error[E0432]: unresolved import `hello`
--> src/main.rs:1:5
|
1 | use hello;
| ^^^^^ no `hello` external crate
Intenté seguir las sugerencias del compilador y las 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?
No necesita el mod hello
en su hello.rs
archivo. El código de cualquier archivo excepto la raíz de la caja ( main.rs
para ejecutables, lib.rs
para bibliotecas) tiene un espacio de nombres automático en un módulo.
Para incluir el código hello.rs
en tu main.rs
, utiliza mod hello;
. Se expande al código que se encuentra hello.rs
(exactamente como lo tenía antes). La estructura de su archivo continúa igual y su código debe cambiarse ligeramente:
main.rs
:
mod hello;
fn main() {
hello::print_hello();
}
hello.rs
:
pub fn print_hello() {
println!("Hello, world!");
}
Si 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:
$ tree src
src
├── main.rs
├── my
│ ├── inaccessible.rs
│ └── nested.rs
└── my.rs
main.rs
mod my;
fn main() {
my::function();
}
my.rs
pub mod nested; // if you need to include other modules
pub fn function() {
println!("called `my::function()`");
}
Óxido 2015
Debe colocar un mod.rs
archivo dentro de su carpeta con el mismo nombre que su módulo. Rust by Ejemplo lo explica mejor.
$ tree src
src
├── main.rs
└── my
├── inaccessible.rs
├── mod.rs
└── nested.rs
main.rs
mod my;
fn main() {
my::function();
}
mod.rs
pub mod nested; // if you need to include other modules
pub fn function() {
println!("called `my::function()`");
}