0Pricing
Learn Rust Coding · レッスン

Derive API

構造体から引数を生成します

「Derive API」はCoddyKit上の無料Learn Rust Codingレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn Rust Coding学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn Rust Codingコースには全4レッスンが含まれています。

derive API

derive API を使うと、CLI を構造体として記述し、#[derive(Parser)] によって clap にパーサーを生成させることができます。

  • builder API よりボイラープレートが少ない
  • 型安全で、フィールドが型付きの値になる

derive feature を有効にして使用してください。

最小限の Parser 構造体

構造体に #[derive(Parser)] を付け、main で Cli::parse() を呼び出します。各フィールドが 1 つの引数になります。

use clap::Parser;

#[derive(Parser)]
struct Cli {
    name: String,
}

fn main() {
    let cli = Cli::parse();
    println!("Hello, {}!", cli.name);
}

フィールドを位置引数にする

name: String のような通常のフィールドは、必須の位置引数になります。フィールド名が値の名前になります。

use clap::Parser;

#[derive(Parser)]
struct Cli {
    input: String,
    output: String,
}

オプションのフィールド

フィールドを Option で包むと、オプションにできます。ユーザーが省略した場合は None が得られます。

use clap::Parser;

#[derive(Parser)]
struct Cli {
    #[arg(short, long)]
    config: Option<String>,
}

フラグとショート形式・ロング形式

#[arg(short, long)] 属性を使うと、フィールド名から -v と --verbose が自動生成されます。bool フィールドはスイッチになります。

use clap::Parser;

#[derive(Parser)]
struct Cli {
    #[arg(short, long)]
    verbose: bool,
}

型付きの値

clap はフィールドの型に合わせて解析します。u32 フィールドでは、数値以外の入力が自動的に拒否されます。

use clap::Parser;

#[derive(Parser)]
struct Cli {
    #[arg(short, long, default_value_t = 1)]
    count: u32,
}

解析済み Cli のモデル化

解析後の Cli 構造体は単なるデータです。この実行可能な例では、解析後にフィールドをどのように使うかを示します。

struct Cli {
    name: String,
    count: u32,
    verbose: bool,
}

fn main() {
    let cli = Cli { name: "Alice".to_string(), count: 2, verbose: true };
    for _ in 0..cli.count {
        println!("Hello, {}! (verbose={})", cli.name, cli.verbose);
    }
}

列挙型としてのサブコマンド

derive API では、#[derive(Subcommand)] を付けた enum でサブコマンドをモデル化します。各バリアントが 1 つのコマンドになります。

use clap::{Parser, Subcommand};

#[derive(Parser)]
struct Cli {
    #[command(subcommand)]
    cmd: Commands,
}

#[derive(Subcommand)]
enum Commands {
    Add { task: String },
    List,
}

enum のサブコマンドを照合する

Cli::parse() の後で enum を照合して、処理を振り分けます。バリアントのデータはきれいにデストラクトできます。

use clap::Parser;

fn run(cli: Cli) {
    match cli.cmd {
        Commands::Add { task } => println!("add {}", task),
        Commands::List => println!("list"),
    }
}

command 属性によるメタデータ

構造体に #[command(name, version, about)] を付けて、CLI のメタデータを設定します。version は Cargo から自動的に読み取ることもできます。

use clap::Parser;

#[derive(Parser)]
#[command(name = "greet", version, about = "Greets people")]
struct Cli {
    name: String,
}

enum によるディスパッチの例

enum を match で照合するパターンは、derive によるサブコマンドの中心です。ここでは同じ考え方を、自己完結した Rust コードで示します。

enum Command {
    Add(String),
    List,
}

fn main() {
    let cmd = Command::Add("Write code".to_string());
    match cmd {
        Command::Add(task) => println!("Added: {}", task),
        Command::List => println!("Listing"),
    }
}

理解度チェック

derive API についての理解度を確認しましょう。

まとめ

derive API は構造体をパーサーに変換します。

  • #[derive(Parser)] と Cli::parse() を使う
  • 通常のフィールドは位置引数になり、Option でオプションにできる
  • #[arg(short, long)] でフラグとオプションを生成する
  • #[derive(Subcommand)] を付けた enum でサブコマンドをモデル化する

次は、検証と整ったヘルプ出力について学びます。

よくある質問

「Derive API」レッスンは無料ですか?

はい。「Derive API」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn Rust Codingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn Rust Codingコースには全4レッスンが含まれています。

「Derive API」で何を学びますか?

構造体から引数を生成します ブラウザで直接実行するハンズオンコードでLearn Rust Codingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Learn Rust Codingを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLearn Rust Codingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「Derive API」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLearn Rust Codingレッスンでコードを書いて実行できますか?

はい。すべてのLearn Rust Codingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. clapの基礎
  2. サブコマンド
  3. Derive API
  4. 検証とヘルプ
← Learn Rust Codingに戻る