Help us understand the problem. What is going on with this article?

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

はじめに

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のところで問題が起こってしまっているので、解決したらまた次の記事を書きたいと思う。

jin237
地方大学に所属する工学部の大学生。専攻は機械だけど、プログラムに興味をもって少しずつやっています。 <ある程度書くことができるプログラム>・C/C++・Python(画像処理、統計)・HTML,CSS・JavaScript・Rust(初心者)・Julia(初心者)   python,rust,juliaの記事を中心に書きます。
https://github.com/jin237/LinearAlgebra
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした