use、super、self

モジュールは、use を使用して別のモジュールのシンボルをスコープに取り込むことができます。次のような記述はモジュールの先頭においてよく見られます。

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

パス

パスは次のように解決されます。

  1. 相対パスの場合:

    • foo または self::foo は、現在のモジュール内の foo を参照します。
    • super::foo は、親モジュール内の foo を参照します。
  2. 絶対パスの場合:

    • crate::foo は、現在のクレートのルート内の foo を参照します。
    • bar::foo は、bar クレート内の foo を参照します。
This slide should take about 8 minutes.
  • シンボルは、より短いパスで「再エクスポート」するのが一般的です。たとえば、クレート内の最上位の lib.rs に、以下のように記述します。

    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::* というようにワイルドカードを含めることができます。この方法は、どのアイテムがインポートされるのかが明確ではなく、時間の経過とともに変化する可能性があるため、おすすめしません。