kdnakt blog

hello there.

Rust dojo第31回を開催した

第31回です。前回はこちら。 

kdnakt.hatenablog.com

 

 

[第31回の様子]

2022/03/16に第31回を開催した。

 

内容としてはRust By Example 日本語版の「10.1. プライベートとパブリック」を最後まで取り組んだ。

 

参加者は5人。いつものメンバーが大体集まってくれた。

 

[学んだこと]

  • 10.1. プライベートとパブリック
  • 前回学んだことの概要
    • mod XXX {}でモジュールになる
    • モジュールには構造体とか関数を定義できる
    • でもデフォルトはプライベートなのでpub修飾子をつけて公開する
    • モジュールはネストできる
    • ネストしたモジュールも関数と同様デフォルトはプライベート
  • プライベートである=アクセスできない、とうはどういうことなのか試してみると、以下のようにコンパイルエラーとなった。わかりやすい。
mod my_mod {
    pub mod nested {
        // my_modの中ではパブリックだが、my_modの外からはアクセスできない
        pub(in crate::my_mod) fn public_function_in_my_mod() {
            print!("called `my_mod::nested::public_function_in_my_mod()`, that\n> ");
            public_function_in_nested();
        }
    }
}

fn main() {
    my_mod::nested::public_function_in_my_mod();
}

// 以下のコンパイルエラー
error[E0603]: function `public_function_in_my_mod` is private
   --> src/main.rs:107:21
    |
107 |     my_mod::nested::public_function_in_my_mod();
    |                     ^^^^^^^^^^^^^^^^^^^^^^^^^ private function
    |
note: the function `public_function_in_my_mod` is defined here
   --> src/main.rs:37:9
    |
37  |         pub(in crate::my_mod) fn public_function_in_my_mod() {
    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  • プライベートなのがモジュールの場合はprivate moduleとエラーメッセージが変わるくらいでコンパイルエラーになるのは同じ
  • プライベートなモジュールも親モジュールの中からならアクセスできた
mod my_mod {
    pub fn public_call_restricted() {
        println!("called `my_mod::public_call_restricted()`");
        private_nested::restricted_function();
    }

    mod private_nested {
        // クレート内パブリックで宣言されているがモジュールがプライベートなのでmy_modの外からは呼べない
        pub(crate) fn restricted_function() {
            println!("called `my_mod::private_nested::restricted_function()`");
        }
    }
}

fn main() {
    my_mod::public_call_restricted();
}

// 以下の内容が出力される
called `my_mod::public_call_restricted()`
called `my_mod::private_nested::restricted_function()`
  • やはりクレートが何なのかよくわからなかったが、「モジュールを集めたライブラリ」と教えてもらってイメージがわいた
    • Javaでいうパッケージがモジュールに近いかな?

 

[まとめ]

モブプログラミングスタイルでRust dojoを開催した。

クレートとモジュールの違いがやっと理解できた回だった。

 

今週のプルリクエストはこちら。

github.com