As primeiras partes do sistema de módulos que cobriremos são pacotes e crates. Uma crate é um binário ou biblioteca. A raiz dos crates é um arquivo fonte a partir do qual o compilador Rust inicia e constitui o módulo raiz da sua crate (explicaremos os módulos em detalhes na seção “Definindo Módulos para Controlar o Escopo e Privacidade”). Um pacote é um ou mais crates que fornecem um conjunto de funcionalidades. Um pacote contém um arquivo Cargo.toml que descreve como construir esses crates.
Várias regras determinam o que um pacote pode conter. Um pacote deve conter zero ou um crate de biblioteca e nada mais. Ele pode conter quantos crates binários você desejar, mas deve conter pelo menos um crate (biblioteca ou binária).
Vamos ver o que acontece quando criamos um pacote. Primeiro, inserimos o comando cargo new
:
$ cargo new my-project
Created binary (application) `my-project` package
$ ls my-project
Cargo.toml
src
$ ls my-project/src
main.rs
Quando inserimos o comando, Cargo criou um arquivo Cargo.toml, dando-nos um pacote. Olhando para o conteúdo de Cargo.toml, não há menção de src/main.rs porque Cargo segue uma convenção de que src/main.rs é a raiz do crate de uma crate binária com o mesmo nome do pacote. Da mesma forma, Cargo sabe que se o diretório do pacote contém src/lib.rs , o pacote contém um crate de biblioteca com o mesmo nome do pacote e src/lib.rs é a raiz do crate. O Cargo passa os arquivos raiz do crate para rustc
construir a biblioteca ou binário.
Aqui, temos um pacote que contém apenas src/main.rs, o que significa que contém apenas um crate binária chamada my-project
. Se um pacote contém src/main.rs e src/lib.rs, ele tem dois crates: uma biblioteca e um binário, ambos com o mesmo nome do pacote. Um pacote pode ter vários crates binárias colocando arquivos no diretório src/bin : cada arquivo será um crate binário separado.
Um crate agrupará funcionalidades relacionadas em um escopo para que a funcionalidade seja fácil de compartilhar entre vários projetos. Por exemplo, o crate rand
que usamos no Capítulo 2 fornece funcionalidade que gera números aleatórios. Podemos usar essa funcionalidade em nossos próprios projetos, trazendo o crate rand
para o escopo do nosso projeto. Todas as funcionalidades fornecidas pelo crate rand
estão acessíveis através do nome do crate rand
.
Manter a funcionalidade de um crate em seu próprio escopo esclarece se uma funcionalidade específica é definida em nosso crate ou no crate rand
e evita conflitos em potencial. Por exemplo, o crate rand
fornece uma característica chamada Rng
. Também podemos definir uma struct
chamada Rng
em nosso próprio crate. Como a funcionalidade de um crate tem um namespace em seu próprio escopo, quando adicionamos rand
como uma dependência, o compilador não fica confuso sobre a que o nome Rng
se refere. Em nosso crate, refere-se a struct Rng
que definimos. Iríamos acessar a característica Rng
do crate rand
como rand::Rng
.
Vamos seguir em frente e falar sobre o sistema de módulos!
Traduzido por Acervo Lima. O original pode ser acessado aqui.
0 comentários:
Postar um comentário