LoginSignup
5
3

More than 3 years have passed since last update.

Rustのモジュールと名前空間まとめ

Last updated at Posted at 2020-05-24

はじめに

この記事は、The Rust Programming languageという本の7章を元にしています。

まとめ

新しいcargoプロジェクトをbinary crateと共に作成する

console
cargo new my-project

新しいcargoプロジェクトをlibrary crateと共に作成する

cargo new --lib my-project

moduleの定義

moduleはネストできる。

module_example.rs
mod my_name_space {
    mod child_name_space {
        fn my_function1() {}
        fn my_function2() {}
    }
}

module内の関数の呼び出し

  • 先頭にcrateを付ける場合は絶対パスでの指定になる。
    そうでない場合は相対パスでの指定になる。

  • 呼び出し元の関数よりネストしている関数や名前空間にアクセスするには、moduleや関数それぞれにpubキーワードが付いている必要がある。

call_example.rs
mod my_name_space {
    pub mod child_name_space {
        pub fn my_function() {}
    }
}

pub fn eat_at_restaurant() {
    crate::my_name_space::my_function();
    my_name_space::my_function();
}

superキーワード

superキーワードは呼び出し元の関数の1つ上のパスを表す。

super_example.rs
fn parent_function()

mod my_namespace {
    fn my_function() {
        super::parent_function();
    }
}

structに対するpub指定

structに対してはメンバ毎にpubキーワードを指定する必要がある

struct_example.rs
mod my_module {
    pub struct MyStruct {
        pub member_var1 : Int,
        member_var2 : Int,
    }
    impl MyStruct{
        pub fn create() -> MyStruct {
            MyStruct {
                member_var1: 5
                member_var2: 8
            }
        }
    }
}
pub fn my_function() {
    let mut instance = my_module::MyStruct::create();
    instance.member_var1 = 12
    //エラー!
    //instance.member_var2 = 15
}

enumに対するpub指定

enum自体をpub指定すると、フィールドは全てpublicになる。

enum_example.rs
mod my_module {
    pub enum MyEnum {
        Elem1,
        Elem2,
    }
}

pub fn my_function {
    let elem1 = my_module::MyEnum::Elem1;
    let elem2 = my_module::MyEnum::Elem2;
}

useによる名前空間の追加

use_module.rs
mod my_module {
    pub mod my_module2 {
        pub fn example_function() {};
    }
    use crate::my_module::my_module2;

    pub fn my_function() {
        my_module2::example_function();
    }
}

selfキーワードを使うと相対指定できる。

use_module.rs
mod my_module {
    pub mod my_module2 {
        pub fn example_function() {};
    }
    use self::my_module::my_module2;

    pub fn my_function() {
        my_module2::example_function();
    }
}

名前空間を追加して別名をつける

asキーワードを使うと名前空間を別名で追加できる

as_keyword.rs
use std::fmt::Result;
use std::io::Result as IoResult;

名前の再エクスポート

pub useキーワードを使うとuseで追加した名前空間をmoduleの外部に公開できる。

pub_use_example.rs
mod my_module{
    pub mod child_module {
        pub fn my_function() {}
    }
}

pub use crate::my_module::child_module;

ネストしたuse指定

通常以下のようにuseを使うが

use std::cmp::Ordering;
use std::io;

中括弧によるネストを使うと以下のようになる

use std::{cmp::Ordering, io};

以下のように名前空間の深さが違う場合、

use std::io;
use std::io::Write;

selfを使うと良い

use std::io::{self, Write};

名前空間以下の要素を全て指定する

*を使うと名前空間以下の要素を全て指定できる。
*はGlob Operatorと呼ばれる。

use std::collections::*;

モジュールを別ファイルに定義して読み込む

mod my_module;のようにmodの宣言の後にセミコロンを置くと、Rustコンパイラはモジュール名と同名のファイルを探して読み込む。

app.rs
mod my_module;

pub use crate::my_module::child_module;

pub fn execute_function() {
    child_module::my_function()
}

my_module.rs
pub mod child_module {
    pub fn my_function();
}
5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3