まえがき
この記事はRUSTチュートリアルをZerobillbank社内メンバー(有志)で勉強がてら、可能な限りわかりやすく内容を書き出す企画の一部です。
なお、初学者のため(略)という免責を打ちつつ間違いなどあればコメントで教えていただけますと一同嬉しく思います!
概要
前項ではモジュールの作り方について説明しました。
本項では、モジュールを読み込む方法と使い方について説明します。
読み込み方
まず外部ライブラリを読み込む場合の読み込み方について。
pub mod a {
pub mod series {
pub mod of {
pub fn nested_modules() {}
}
}
}
// use {library} で読み込み
use a
上記のように、 use
の後に読み込むモジュールを指定します。
続いてモジュールの使用の仕方について説明します。
フルパスで指定する
スコープを全て記述して使用する方法です。
pub mod a {
pub mod series {
pub mod of {
pub fn nested_modules() {}
}
}
}
fn main() {
a::series::of::nested_modules();
}
スコープをuseで定義して使用時に省略する
続いてタイトルの通り use
キーワードにスコープまで記述して、使用時の記述では省略する方法です。
pub mod a {
pub mod series {
pub mod of {
pub fn nested_modules() {}
}
}
}
use a::series::of;
fn main() {
of::nested_modules();
}
enum などの列挙型を使用する
enumについても名前空間扱いなので、列挙子を使用することも可能です。
enum TrafficLight {
Red,
Yellow,
Green,
}
use TrafficLight::{Red, Yellow};
fn main() {
let red = Red;
let yellow = Yellow;
let green = TrafficLight::Green;
}
一つのライブラリから複数の要素をスコープに含めたい場合、enumに限らず '波カッコ' と 'カンマ' 区切りで記述することで使用可能です。
全ての名前をスコープに導入する
列挙型もそうですが、一括してスコープに導入したい場合もあるかと思います。
そういったときは glob
と呼ばれる演算子を使うことで全て導入することが可能です。
enum TrafficLight {
Red,
Yellow,
Green,
}
// 正規表現の * が glob と呼称される
use TrafficLight::*;
fn main() {
let red = Red;
let yellow = Yellow;
let green = Green;
}
super を使用して親モジュールにアクセスする
rustでは、そのファイルからみて配下の階層にある関数にアクセスを行うことがデフォルトの挙動になります。
communicator
├── client
├── network
| └── client
└── tests
例えば前項で作成した communicator ライブラリの階層でみたとき、testsフォルダからは
どのモジュールにもアクセスはできません。
testsディレクトリからclientディレクトリ配下のモジュールにアクセスするとき、
Linuxでいう1階層上がる処理が必要になります。
この1階層上がるためには super
という記述を使用します。
pub mod client;
pub mod network;
#[cfg(test)]
mod tests {
#[test]
fn it_works() {
client::connect();
}
}
上記のもともと存在していたlib.rsに記述されているテストコード #[cfg(test)]
では、
tests内にある it_works
関数から client::connect()
を実行しようとしていますので、
読み込めずエラーが発生してしまいます。
(そもそも外部モジュールの読み込みを行う記述もないので追記が必要です。)
ここにsuperを含むモジュール読み込みの記述を追記します。
#[cfg(test)]
mod tests {
use super::client;
#[test]
fn it_works() {
client::connect();
}
}
こうすることで、エラーが発生することなく cargo test
が実行できるようになります。