0Pricing
Learn Rust Coding · Урок

API derive

Аргументы из структур

«API derive» — бесплатный урок Learn Rust Coding на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn Rust Coding, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn Rust Coding содержит 4 уроков всего.

API derive

API derive позволяет описать CLI в виде структуры и поручить clap создать разборщик с помощью #[derive(Parser)].

  • Меньше шаблонного кода, чем при использовании API-конструктора
  • Безопасность типов: поля становятся типизированными значениями

Включите его с помощью функции derive.

Минимальная структура Parser

Добавьте к структуре аннотацию #[derive(Parser)] и вызовите Cli::parse() в main. Каждое поле становится одним аргументом.

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);
    }
}

Подкоманды в виде перечислений

В API derive перечисление с атрибутом #[derive(Subcommand)] моделирует подкоманды. Каждый вариант является командой.

use clap::{Parser, Subcommand};

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

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

Сопоставление подкоманд перечисления

После Cli::parse() сопоставьте перечисление, чтобы передать управление. Данные варианта удобно деструктурировать.

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,
}

Демонстрация диспетчеризации перечисления

Сопоставление с перечислением — основа подкоманд 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"),
    }
}

Быстрая проверка

Проверьте, насколько хорошо Вы усвоили API derive.

Повторение

API derive превращает структуры в разборщики:

  • #[derive(Parser)] вместе с Cli::parse()
  • Обычные поля являются позиционными аргументами, а Option делает их необязательными
  • #[arg(short, long)] создаёт флаги и параметры
  • Перечисления с #[derive(Subcommand)] моделируют подкоманды

Далее: проверка значений и улучшенный вывод справки.

Часто задаваемые вопросы

Урок «API derive» бесплатный?

Да — полный текст урока «API derive» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn Rust Coding, подпишись на CoddyKit PRO. Курс Learn Rust Coding содержит 4 уроков всего.

Чему я научусь в уроке «API derive»?

Аргументы из структур Ты практикуешь Learn Rust Coding с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Learn Rust Coding?

Предыдущий опыт не требуется. Learn Rust Coding на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «API derive»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Learn Rust Coding?

Да. Каждый урок Learn Rust Coding включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Основы clap
  2. Подкоманды
  3. API derive
  4. Проверка и справка
← Назад к Learn Rust Coding