第33回です。前回はこちら。
[第33回の様子]
2022/03/30に第33回を開催した。3がいっぱい!
内容としてはRust By Example 日本語版の「10.5. ファイルの階層構造」に取り組んだ。
参加者は6人。最初別の人がドライバをやっていたのだけれど、急遽自分のローカル環境を使って自分がドライブすることに。言われた通りに手を動かすの楽でいいな〜。
[学んだこと]
- 10.5. ファイルの階層構造
- モジュールはファイルの階層構造と対応関係にあるらしい
- ファイルはこんな感じで配置されている:split.rsから
my
モジュールを利用する形
$ tree . . |-- my | |-- inaccessible.rs | |-- mod.rs | `-- nested.rs `-- split.rs
- 次のように
mod my;
と書くとmy.rs
または、my/mod.rs
という名のファイルを探してくれるらしい
mod my; fn main() { //my/mod.rs
で定義されている関数function()
を呼び出している my::function(); }
my/mod.rs
はこのようになっている
// ネストしたモジュールを定義している // pubがついていない場合プライベートなので、split.rsからは呼び出せない mod inaccessible; pub mod nested; pub fn function() { println!("called `my::function()`"); }
- このあたりでオヤ?と思いRustに詳しい参加者に聞いてみると、以下のことがわかった
my/mod.rs
のような書き方は2015年版までの古い書き方で、2018年版以降はmy.rs
のスタイルらしい- そして
my.rs
にはネストしたモジュールの定義だけ行い、個別の関数はネスト側に実装するのがよくあるパターンとのこと - 確かに、Rustupは後者の書き方をしていた。
- cargoはmod.rs方式で書かれているが、同じようにそこではモジュール定義だけを行なっていた
- テキストの説明はmod.rs方式だったが、せっかくなのでmy.rs方式を実装してみることに
- まずはmy2.rsを以下のように作成する
pub fn function() { println!("called `my2::function()`"); }
- そしてsplit.rsでmy2モジュールを呼び出す
mod my; mod my2; fn main() { // call function via mod.rs my::function(); // called `my::function()`が出力される // call function via my2.rs my2::function(); // called `my2::function()`が出力される }
- その他、モジュール内のプライベートな関数への間接アクセスなどの説明があったが、そのあたりは第31回でやった内容とほぼ同じなので割愛。
- あれをファイル分割して書くとこうなるんだ、というのが理解できたのでよかった
[まとめ]
モブプログラミングスタイルでRust dojoを開催した。
ファイル分割してRustモジュールを定義する方法を学んだ!
今週のプルリクエストはこちら。