Óxido - Módulos

Un grupo lógico de código se denomina Módulo. Se compilan varios módulos en una unidad llamadacrate. Los programas de Rust pueden contener una caja binaria o una caja de biblioteca. Una caja binaria es un proyecto ejecutable que tiene un método main () . Una caja de biblioteca es un grupo de componentes que se pueden reutilizar en otros proyectos. A diferencia de una caja binaria, una caja de biblioteca no tiene un punto de entrada (método main ()). La herramienta Cargo se usa para administrar cajas en Rust. Por ejemplo, el módulo de red contiene funciones relacionadas con la red y el módulo de gráficos contiene funciones relacionadas con el dibujo. Los módulos son similares a los espacios de nombres en otros lenguajes de programación. Las cajas de terceros se pueden descargar usando cargo de crates.io .

No Señor Término y descripción
1

crate

Es una unidad de compilación en Rust; Crate se compila en binario o biblioteca.

2

cargo

La herramienta oficial de gestión de paquetes de Rust para cajas.

3

module

Lógicamente agrupa el código dentro de una caja.

4

crates.io

El registro oficial de paquetes de Rust.

Sintaxis

//public module
pub mod a_public_module {
   pub fn a_public_function() {
      //public function
   }
   fn a_private_function() {
      //private function
   }
}
//private module
mod a_private_module {
   fn a_private_function() {
   }
}

Los módulos pueden ser públicos o privados. Otros módulos no pueden acceder a los componentes de un módulo privado. Los módulos en Rust son privados por defecto. Por el contrario, otros módulos pueden acceder a las funciones de un módulo público. Los módulos deben tener el prefijopubpalabra clave para hacerlo público. Las funciones dentro de un módulo público también deben hacerse públicas.

Ilustración: Definición de un módulo

El ejemplo define un módulo público: películas . El módulo contiene una función play () que acepta un parámetro e imprime su valor.

pub mod movies {
   pub fn play(name:String) {
      println!("Playing movie {}",name);
   }
}
fn main(){
   movies::play("Herold and Kumar".to_string());
}

Salida

Playing movie Herold and Kumar

Usar palabra clave

La palabra clave use ayuda a importar un módulo público.

Sintaxis

use public_module_name::function_name;

Ilustración

pub mod movies {
   pub fn play(name:String) {
      println!("Playing movie {}",name);
   }
}
use movies::play;
fn main(){
   play("Herold and Kumar ".to_string());
}

Salida

Playing movie Herold and Kumar

Módulos anidados

Los módulos también se pueden anidar. El módulo de comedia está anidado dentro del módulo en inglés , que además está anidado en el módulo de películas . El ejemplo que se muestra a continuación define una función de juego dentro del módulo películas / inglés / comedia .

pub mod movies {
   pub mod english {
      pub mod comedy {
         pub fn play(name:String) {
            println!("Playing comedy movie {}",name);
         }
      }
   }
}
use movies::english::comedy::play; 
// importing a public module

fn main() {
   // short path syntax
   play("Herold and Kumar".to_string());
   play("The Hangover".to_string());

   //full path syntax
   movies::english::comedy::play("Airplane!".to_string());
}

Salida

Playing comedy movie Herold and Kumar
Playing comedy movie The Hangover
Playing comedy movie Airplane!

Ilustración: Cree una caja de biblioteca y consuma en una caja binaria

Creemos una caja de biblioteca llamada movie_lib, que contiene un módulo movies. Para construir elmovie_lib caja de la biblioteca, usaremos la herramienta cargo.

Paso 1: crear la carpeta del proyecto

Cree una carpeta movie-app seguida de una subcarpeta movie-lib . Después de crear la carpeta y la subcarpeta, cree unasrccarpeta y un archivo Cargo.toml en este directorio. El código fuente debe ir en la carpeta src . Cree los archivos lib.rs y movies.rs en la carpeta src. El archivo Cargo.toml contendrá los metadatos del proyecto como número de versión, nombre del autor, etc.

La estructura del directorio del proyecto será como se muestra a continuación:

movie-app
   movie-lib/
      -->Cargo.toml
      -->src/
         lib.rs
         movies.rs

Paso 2: edite el archivo Cargo.toml para agregar metadatos del proyecto

[package]
name = "movies_lib"
version = "0.1.0"
authors = ["Mohtashim"]

Paso 3: edite el archivo lib.rs.

Agregue la siguiente definición de módulo a este archivo.

pub mod movies;

La línea anterior crea un módulo público: movies.

Paso 4: edita el archivo movies.rs

Este archivo definirá todas las funciones del módulo de películas.

pub fn play(name:String){
   println!("Playing movie {} :movies-app",name);
}

El código anterior define una función play() que acepta un parámetro y lo imprime en la consola.

Paso 5: construye la caja de la biblioteca

Cree una aplicación con cargo buildcomando para verificar si la caja de la biblioteca está estructurada correctamente. Asegúrese de estar en la raíz del proyecto: la carpeta de la aplicación de películas. El siguiente mensaje se mostrará en la terminal si la compilación tiene éxito.

D:\Rust\movie-lib> cargo build
   Compiling movies_lib v0.1.0 (file:///D:/Rust/movie-lib)
   Finished dev [unoptimized + debuginfo] target(s) in 0.67s

Paso 6: cree una aplicación de prueba

Crea otra carpeta movie-lib-testen la carpeta movie-app seguida de un archivo Cargo.toml y la carpeta src. Este proyecto debe tener un método principal ya que se trata de una caja binaria, que consumirá la caja de la biblioteca creada previamente. Cree un archivo main.rs en la carpeta src. La estructura de la carpeta será como se muestra.

movie-app
   movie-lib 
   // already completed

   movie-lib-test/
      -->Cargo.toml
      -->src/
         main.rs

Paso 7: agregue lo siguiente en el archivo Cargo.toml

[package]
name = "test_for_movie_lib"
version = "0.1.0"
authors = ["Mohtashim"]

[dependencies]
movies_lib = { path = "../movie-lib" }

NOTE- La ruta a la carpeta de la biblioteca se establece como dependencias. El siguiente diagrama muestra el contenido de ambos proyectos.

Paso 8: agregue lo siguiente al archivo main.rs

extern crate movies_lib;
use movies_lib::movies::play;
fn main() {
   println!("inside main of test ");
   play("Tutorialspoint".to_string())
}

El código anterior importa un paquete externo llamado movies_lib. Consulte el Cargo.toml del proyecto actual para verificar el nombre de la caja.

Paso 9: uso de construcción de carga y recorrido de carga

Usaremos la construcción de carga y la ejecución de carga para construir el proyecto binario y ejecutarlo como se muestra a continuación: