¿Cómo puedo incluir un módulo de otro archivo del mismo proyecto?

Resuelto ave asked hace 9 años • 6 respuestas

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 buildsale

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.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?

ave avatar Oct 16 '14 00:10 ave
Aceptado

No necesita el mod helloen su hello.rsarchivo. El código de cualquier archivo excepto la raíz de la caja ( main.rspara ejecutables, lib.rspara bibliotecas) tiene un espacio de nombres automático en un módulo.

Para incluir el código hello.rsen 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!");
}
Renato Zannon avatar Oct 15 '2014 18:10 Renato Zannon

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.rsarchivo 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()`");
}
amxa avatar Mar 25 '2018 13:03 amxa