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 — локальная установка не требуется.
Все уроки этого курса
- Основы clap
- Подкоманды
- API derive
- Проверка и справка