LoginSignup
0

More than 3 years have passed since last update.

モジュールとアイテムの可視性1(Rustの基本構文-10-)

Posted at

はじめに

Rustの基本的な文法についてまとめてみた。第9回。
今回のテーマは「モジュール」について。複雑なプログラムを書くときにはパッケージを複数のモジュールに分割したほうがプログラムの見通しがよくなる。

目的

Rustにおける基本的な構文の理解をする。

Rustの基本構文シリーズ

第5回⇒Rustの基本構文(5)  URL:https://qiita.com/jin237/items/3fc3341effb3670e5865
第6回⇒Rustの基本構文(6)  URL:https://qiita.com/jin237/items/903e33226f93e7a4e5a0
第7回⇒Rustの基本構文(7)  URL:https://qiita.com/jin237/items/fcb5a05fb902dee1fc4d
第8回⇒Rustの基本構文(8)  URL:https://qiita.com/jin237/items/d544edcdfc7a08fa6998
第9回⇒Rustの基本構文(9)  URL: https://qiita.com/jin237/items/91eafe801d29d56c2cc2

modキーワードとpubキーワード

プログラムを複数のモジュールに分割するためにmodキーワードを使用する。

例を引用してくる。(from 実践Rust入門 言語仕様から開発手法まで P.247)

mod server {
    //Server module in this
    fn echo() {
        //This is werver::echo function
        println!("Server");
    }
}

mod client {
    //Client module in this
    fn echo() {
        //Thie is client::echo function
        println!("Client");
    }
}

fn main() {
    //call "echo function in server module"
    server::echo();
    //call "echo funstion in client module"
    client::echo();
}

このように、中身がどうなっている状態かを示して、main関数にて呼び出すような使い方をする。pythonでのmodule簡易版みたいなイメージでいいのではないだろうか。しかし、この状態のプログラムでは実行することができない。
以下のようなエラーが引き起こされる。

[Running] cd "c:\Users\[username]\rust\project1\" && rustc [filename].rs && "c:\Users\[username]\rust\project1\"[filename]
error[E0603]: function `echo` is private
  --> module_function.rs:20:13
   |
20 |     server::echo();
   |             ^^^^

error[E0603]: function `echo` is private
  --> module_function.rs:22:13
   |
22 |     client::echo();
   |             ^^^^

error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0603`.

[Done] exited with code=1 in _.___ seconds

function 'echo' is privateと記されていることに注目。すなわち、この状態のモジュールはプライベート状態となっていて呼び出すことはできない。これをpublic的なものにすれば呼び出すことができる。そこで、module内のfnの前に"pub"と入れることで解消できる。

mod server {
    //Server module in this
    pub fn echo() {
        //This is werver::echo function
        println!("Server");
    }
}

mod client {
    //Client module in this
    pub fn echo() {
        //Thie is client::echo function
        println!("Client");
    }
}

fn main() {
    //call "echo function in server module"
    server::echo();
    //call "echo funstion in client module"
    client::echo();
}

このプログラムで実行してみると以下のようにprintln!の部分が表示される。

[Running] cd "c:\Users\[username]\rust\project1\" && rustc [filename].rs && "c:\Users\[username]\rust\project1\"[filename]
Server
Client

[Done] exited with code=0 in _.___ seconds

この構造は上手に使うことでしっかりと整理されたプログラムが書くことができる。
ただし、この場合、どこからのアクセスも受けられる状態となってしまうので、それに対してオプションを付けることで制限または一部に対してのみパブリック状態とできる。

さいごに

パブリックオプションについては次回の記事で書こうと思っているが、正直まだ自分自身が理解できていなくcrateのところで問題が起こってしまっているので、解決したらまた次の記事を書きたいと思う。

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
0