Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Использование use, super и self

Модуль может внести символы из другого модуля в область видимости с помощью use. Обычно в начале каждого модуля вы увидите что-то подобное:

// Copyright 2022 Google LLC
// SPDX-License-Identifier: Apache-2.0

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

Пути

Пути разрешаются следующим образом:

  1. Как относительный путь:

    • foo или self::foo ссылаются на foo в текущем модуле,
    • super::foo ссылается на foo в родительском модуле.
  2. Как абсолютный путь:

    • crate::foo ссылается на foo в корне текущего крейта,
    • bar::foo ссылается на foo в крейте bar.
This slide should take about 8 minutes.
  • Часто символы «реэкспортируют» по более короткому пути. Например, верхний lib.rs в крейте может содержать

    // Copyright 2022 Google LLC
    // SPDX-License-Identifier: Apache-2.0
    
    mod storage;
    
    pub use storage::disk::DiskStorage;
    pub use storage::network::NetworkStorage;

    что позволяет сделать DiskStorage и NetworkStorage доступными другим крейтам по удобному короткому пути.

  • В основном use нужен только для элементов, которые появляются в модуле. Однако трейт должен быть в области видимости, чтобы вызывать любые его методы, даже если тип, реализующий этот трейт, уже находится в области видимости. Например, чтобы использовать метод read_to_string для типа, реализующего трейт Read, нужно написать use std::io::Read.

  • Оператор use может содержать подстановочный символ: use std::io::*. Это не рекомендуется, потому что неясно, какие элементы импортированы, а они со временем могут меняться.