kdnakt blog

hello there.

Rust dojo第33回を開催した

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

kdnakt.hatenablog.com

 

 

[第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モジュールを定義する方法を学んだ!

 

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

github.com