use, super, self

Um módulo pode trazer símbolos de outro módulo para o escopo com use. Normalmente, você verá algo assim na parte superior de cada módulo:

use std::collections::HashSet;
use std::process::abort;

Caminhos (Paths)

Caminhos são resolvidos da seguinte forma:

  1. Como um caminho relativo:

    • foo ou self::foo referem-se à foo no módulo atual,
    • super::foo refere-se à foo no módulo pai.
  2. Como um caminho absoluto:

    • crate::foo refere-se à foo na raiz do crate atual,
    • bar::foo refere-se a foo no crate bar.
This slide should take about 8 minutes.
  • É comum “re-exportar” símbolos em um caminho mais curto. Por exemplo, o nível superior lib.rs em um crate pode ter

    mod storage;
    
    pub use storage::disk::DiskStorage;
    pub use storage::network::NetworkStorage;

    tornando DiskStorage e NetworkStorage disponíveis para outros crates com um caminho conveniente e curto.

  • Na maior parte, apenas itens que aparecem em um módulo precisam ser use. No entanto, um trait deve estar no escopo para chamar quaisquer métodos nesse trait, mesmo que um tipo que implemente esse trait já esteja no escopo. Por exemplo, para usar o método read_to_string em um tipo que implementa o trait Read, você precisa use std::io::Read.

  • A instrução use pode ter um curinga: use std::io::*. Isso é desencorajado porque não está claro quais itens são importados, e eles podem mudar ao longo do tempo.