use、super、self
モジュールは、use を使って別のモジュールのシンボルをスコープに取り込めます。通常、各モジュールの先頭には次のようなものがあります。
// Copyright 2022 Google LLC // SPDX-License-Identifier: Apache-2.0 use std::collections::HashSet; use std::process::abort;
パス
パスは次のように解決されます。
-
相対パスとして:
fooまたはself::fooは、現在のモジュール内のfooを参照します。super::fooは、親モジュール内のfooを参照します。
-
絶対パスとして:
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;これにより、
DiskStorageとNetworkStorageは、便利で短いパスで他のクレートから利用できるようになります。 -
ほとんどの場合、
useする必要があるのは、そのモジュール内に現れるアイテムだけです。ただし、あるトレイトのメソッドを呼び出すには、そのトレイトを実装している型がすでにスコープ内にあったとしても、そのトレイト自体がスコープ内になければなりません。たとえば、Readトレイトを実装している型でread_to_stringメソッドを使うには、use std::io::Readが必要です。 -
use文ではワイルドカードを使えます:use std::io::*。これは、どのアイテムがインポートされるのかが明確でなく、それらが将来変わる可能性もあるため、推奨されません。