Rustのuse文のメモ。
useは、モジュール内の構造体・列挙型・トレイトや関数をインポートする。
(Javaのimport文に相当)
インポートしておくと、モジュールツリーのパスをいちいち書く必要が無くなる。
また、インポートした要素を「あたかも自分のモジュールに存在する要素であるかのように、他のモジュールから使用できるようにする」ことも出来る。→再公開
標準ライブラリー(std::prelude::*
)は、明示的にuseを書かなくても自動的にインポートされる。
その他のライブラリーでも、preludeという名前のモジュールが用意されることがあるらしい。
preludeをインポートすると、そのライブラリーの代表的な構造体や関数やマクロ等が一通り使えるようになって便利、ということらしい。
(このpreludeは(標準ライブラリーではないので)自動的にインポートされるわけではない)
use hoge_library::prelude::*;
useは以下のような構文。
〔可視性〕use パス〔as 別名〕; 〔可視性〕use パスの前半::{ パスの後半〔as 別名〕, … };
パスは「モジュール名1::モジュール名2::…::構造体名
」のような形式。
デフォルトでは自分のモジュールからの相対パス。
絶対パスのcrateや、相対パスのselfやsuperも使える。→モジュールツリーのパス
useは大抵はソースファイルの先頭に書くが、関数本体に書くことも出来る。[2024-09-18]
可視性をpubにすると、インポートされた要素は、あたかも自分のモジュールに存在する要素であるかのように、他のモジュールから使用できるようになる。
これを再公開(re-exporting)と言う。
(Unixのシンボリックリンクを張るようなイメージ)
use crate::sub1::sub2::Sub2Struct1;
use crate::sub1::sub2::Sub2Struct1 as MyStruct;
use crate::sub1::sub2::{ Sub2Struct1, Sub2Struct2 };
use crate::sub1::{ Sub1Struct, sub2::Sub2Struct, };
モジュールと、サブモジュールの要素を一緒にインポートする例。
モジュールを指定するものとしてselfを使う。
use crate::sub1::{ self, sub2::Sub2Struct, };
この例は「use crate::sub1;
」と「use create::sub1:sub2::Sub2Struct;
」をひとつのuseで書いたもの。
公開されている全要素をインポートしたい場合は「*
」(glob演算子)を使うことが出来る。
use crate::sub1::sub2::*;
関数をインポートする場合、関数名を直接インポートするのではなく、モジュールをインポートし、その関数を使う際は「モジュール名::関数名
」とするのが慣例なんだそうだ。
pub fn func() { println!("sub2_func"); }
pub(crate) mod sub2;
mod sub1; use sub1::sub2; // モジュールをインポートする fn main() { sub2::func(); // 「モジュール名::関数名」で呼び出す }