わずかでも

進んでいるならそれでよし。clap::Parserをderiveすることで、commandやargの属性を利用できるようになり、clap::Argsをderiveすることでgroupの属性を利用できるようになる。このつながりが分かるともやもやがだいぶ晴れる。

公式ページのstdクレートの説明をたどって実装を確認できると、いざというときに役立つ。まずは、stdクレートで何が定義されているかをざっと見ておくとしよう。Pythonも標準モジュールを一通り眺めてからは、REPLでちょこっと確認することで実装を進めるうえでの効率が良くなったし。

stdクレートに列挙されているモジュールを開き、そこに定義されている構造体を開き、実装されている関数を確認する。構造体と密接に関わるトレイトとこの構造体での実装も(使いそうなものだけ)確認する。実装の詳細を確認するには右側にしれっと存在するsourceリンクをクリックする。

構造体やトレイトに実装した関数を宣言時のままでも呼び出せるというのがわかり、構造体やトレイトの定義と実装の定義を分離するrustの流儀が「Cで書いているときに欲しかったのはrustのimpl ~ for ~だったのだ」とつながった気がする。

// 定義
struct Hoge;
impl Hoge {
    fn hoge(&self) {
        println!("Hello from Hoge");
    }
}

// 利用
fn main() {
    let hoge = Hoge;
    // 宣言そのままの形式で呼び出し
    Hoge::hoge(&hoge);
    // シンタックスシュガー(と呼ぶのは正しいのかわからないが…)で呼び出し
    hoge.hoge();
}