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 は、bar クレート内の foo を参照します。
  • シンボルをより短いパスで「再エクスポート」するのは一般的です。たとえば、クレートの最上位の lib.rs には次のような記述があるかもしれません。

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

    これにより、DiskStorageNetworkStorage は、便利で短いパスで他のクレートから利用できるようになります。

  • ほとんどの場合、use する必要があるのは、そのモジュール内に現れるアイテムだけです。ただし、あるトレイトのメソッドを呼び出すには、そのトレイトを実装している型がすでにスコープ内にあったとしても、そのトレイト自体がスコープ内になければなりません。たとえば、Read トレイトを実装している型で read_to_string メソッドを使うには、use std::io::Read が必要です。

  • use 文ではワイルドカードを使えます: use std::io::*。これは、どのアイテムがインポートされるのかが明確でなく、それらが将来変わる可能性もあるため、推奨されません。