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フィードバックを取得できます。ローカル設定は不要です。