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