quarta-feira, 7 de abril de 2021

Pacotes e Crates

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.

Licença

0 comentários:

Postar um comentário