🐱
『実践Rustプログラミング入門』で学ぶ
『実践Rustプログラミング入門』を読んでいく
コードの公開場所
コードはこちらで公開されている
4章でコマンド入力アプリを学ぶ
標準クレートだけのパターン
use std::env;
fn main() {
let args: Vec<String> = env::args().collect();
println!("{:?}", args);
}
-
std::env::args()
でコマンドプロンプトからの入力を拾う -
.collect()
でベクター形式にする - コマンドプロンプトからの入力を
args
に入れる - 型は
Vec<String>
とする(文字列のベクター型) -
args
をプリントする(形式は{:?}
というデバッグ形式)
clapクレートのbuilderを使うパターン
use clap::{arg, App};
fn main() {
let matches = App::new("My RPN program")
.version("1.0.0")
.author("Your name")
.about("Super awesome sample RPN calculator")
.arg(arg!([FILE] "Formulas written in RPN").required(false))
.arg(arg!(-v --verbose ... "Sets the level of verbosity").required(false))
.get_matches();
match matches.value_of("FILE") {
Some(file) => println!("File specified: {}", file),
None => println!("No file specified."),
}
let verbose = matches.is_present("verbose");
println!("Is verbosity specified?: {}", verbose);
}
-
My RPN program
というApp
を作成してmacthes
とする -
version
やauthor
などを設定する - 必要に応じて、式が書かれたファイル
FILE
を読み込む - 必要に応じて、冗長性
verbosity
のレベルを変える -
FILE
やverbose
があれば、それぞれプリントする
clapクレートのderiveマクロを使うパターン
use clap::Parser;
#[derive(Parser, Debug)]
#[clap(
name = "My RPN program",
version = "1.0.0",
author = "Your name",
about = "Super awesome sample RPN calculator"
)]
struct Opts {
/// Sets the level of verbosity
#[clap(short, long)]
verbose: bool,
/// Formulas written in RPN
#[clap(name = "FILE")]
formula_file: Option<String>,
}
fn main() {
let opts = Opts::parse();
match opts.formula_file {
Some(file) => println!("File specified: {}", file),
None => println!("No file specified."),
}
println!("Is verbosity specified?: {}", opts.verbose);
}
- 注記
#[clap()]
でname
やversion
などを入力する - 構造体
Opts
を設定する(冗長性verbose
、ファイルFILE
が要素になる) -
Opts::parse()
でコマンドプロンプトからの入力を受け取りopts
にする -
match
とSome(T)
と使って、FILE
をプリントする - 冗長性
verbose
をプリントする
Discussion