Ferrugem - Módulos

Um grupo lógico de código é chamado de Módulo. Vários módulos são compilados em uma unidade chamadacrate. Os programas Rust podem conter uma caixa binária ou uma caixa de biblioteca. Uma caixa binária é um projeto executável que possui um método main () . Uma caixa de biblioteca é um grupo de componentes que podem ser reutilizados em outros projetos. Ao contrário de uma caixa binária, uma caixa de biblioteca não tem um ponto de entrada (método main ()). A ferramenta Cargo é usada para gerenciar caixas em Rust. Por exemplo, o módulo de rede contém funções relacionadas à rede e o módulo gráfico contém funções relacionadas a desenhos. Os módulos são semelhantes aos namespaces em outras linguagens de programação. Caixas de terceiros podem ser baixadas usando carga em crates.io .

Sr. Não Termo e descrição
1

crate

É uma unidade de compilação em Rust; Crate é compilado em binário ou biblioteca.

2

cargo

A ferramenta oficial de gerenciamento de pacotes Rust para caixas.

3

module

Agrupa logicamente o código dentro de uma caixa.

4

crates.io

O registro oficial do pacote Rust.

Sintaxe

//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() {
   }
}

Os módulos podem ser públicos ou privados. Os componentes em um módulo privado não podem ser acessados ​​por outros módulos. Módulos em Rust são privados por padrão. Ao contrário, as funções em um módulo público podem ser acessadas por outros módulos. Módulos devem ser prefixados compubpalavra-chave para torná-lo público. As funções em um módulo público também devem ser tornadas públicas.

Ilustração: Definindo um Módulo

O exemplo define um módulo público - filmes . O módulo contém uma função play () que aceita um parâmetro e imprime seu valor.

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

Resultado

Playing movie Herold and Kumar

Use palavra-chave

A palavra-chave use ajuda a importar um módulo público.

Sintaxe

use public_module_name::function_name;

Ilustração

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

Resultado

Playing movie Herold and Kumar

Módulos Aninhados

Os módulos também podem ser aninhados. O módulo de comédia está aninhado no módulo em inglês , que também está aninhado no módulo de filmes . O exemplo fornecido abaixo define uma função executada dentro do módulo movies / english / comedy .

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());
}

Resultado

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

Ilustração - Crie uma caixa de biblioteca e consuma em uma caixa binária

Vamos criar uma caixa de biblioteca chamada movie_lib, que contém um módulo movies. Para construir omovie_lib caixa da biblioteca, vamos usar a ferramenta cargo.

Etapa 1 - Criar pasta de projeto

Crie uma pasta movie-app seguida por uma subpasta movie-lib . Depois que a pasta e a subpasta forem criadas, crie umsrcpasta e um arquivo Cargo.toml neste diretório. O código-fonte deve ir para a pasta src . Crie os arquivos lib.rs e movies.rs na pasta src. O arquivo Cargo.toml conterá os metadados do projeto, como número da versão, nome do autor, etc.

A estrutura do diretório do projeto será conforme mostrado abaixo -

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

Etapa 2 - Edite o arquivo Cargo.toml para adicionar metadados do projeto

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

Etapa 3 - Edite o arquivo lib.rs.

Adicione a seguinte definição de módulo a este arquivo.

pub mod movies;

A linha acima cria um módulo público - movies.

Etapa 4 - Edite o arquivo movies.rs

Este arquivo definirá todas as funções do módulo de filmes.

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

O código acima define uma função play() que aceita um parâmetro e o imprime no console.

Etapa 5 - Construir a caixa da biblioteca

Crie um aplicativo usando o cargo buildcomando para verificar se a caixa da biblioteca está estruturada corretamente. Certifique-se de que está na raiz do projeto - a pasta do aplicativo do filme. A seguinte mensagem será exibida no terminal se a construção for bem-sucedida.

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

Etapa 6 - Criar um aplicativo de teste

Crie outra pasta movie-lib-testna pasta movie-app seguida por um arquivo Cargo.toml e a pasta src. Este projeto deve ter o método principal por se tratar de uma caixa binária, que consumirá a caixa da biblioteca criada anteriormente. Crie um arquivo main.rs na pasta src. A estrutura da pasta será conforme mostrado.

movie-app
   movie-lib 
   // already completed

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

Etapa 7 - Adicione o seguinte no arquivo Cargo.toml

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

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

NOTE- O caminho para a pasta da biblioteca é definido como dependências. O diagrama a seguir mostra o conteúdo de ambos os projetos.

Etapa 8 - Adicionar o seguinte ao arquivo main.rs

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

O código acima importa um pacote externo chamado movies_lib. Verifique o Cargo.toml do projeto atual para verificar o nome da caixa.

Etapa 9 - Uso de construção de carga e movimentação de carga

Usaremos a construção de carga e a execução de carga para construir o projeto binário e executá-lo conforme mostrado abaixo -