第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モジュールを定義する方法を学んだ!
今週のプルリクエストはこちら。