[第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を開催した。
クレートとモジュールの違いがやっと理解できた回だった。
今週のプルリクエストはこちら。