Open12
Learn | Rust
Rustチュートリアルを試してみる
構文調べる
use ferris_says::say;
crate
は自分のファイルで定義したcrateを呼び出したい場合?
crate::hoge::piyo();
crates.ioで公開されているcrateを呼び出したい場合はcrate
を含めなくて良さそう。
hoge::piyo();
通常のコメント これはコンパイラによって完全に無視されます。
// 行末までコメントアウト
/* ブロックによって囲まれた部分をコメントアウト */
ドキュメンテーションコメント ライブラリのドキュメンテーションとしてhtmlにパースされます。
/// このコメントの下の内容に関するドキュメントとなります
//! このコメントを含むソースのドキュメントになります
CLIツール作成チュートリアルをやってみる
Getting the arguments
fn main() {
let pattern = std::env::args().nth(1).expect("no pattern given");
let path = std::env::args().nth(2).expect("no path given");
println!("pattern: {:?}, path: {:?}", pattern, path)
}
↓について調べる
std
env
std::env::args()
標準ライブラリが持つ関数で、渡された引数のイテレーターを取得できる。
引数で渡されるデータの構造を定義する。
struct Cli {
pattern: String,
path: std::path::PathBuf,
}
-
PathBufについて
String
に近い型だがクロスプラットフォームで機能するファイルシステムパスの型
struct Cli {
pattern: String,
path: std::path::PathBuf,
}
fn main() {
let pattern = std::env::args().nth(1).expect("no pattern given");
let path = std::env::args().nth(2).expect("no path given");
/// structを適用
let args = Cli {
pattern,
path: std::path::PathBuf::from(path),
};
println!("pattern: {:?}, path: {:?}", args.pattern, args.path);
}
clapで引数の解析を行う
※clap
はCLIの引数解析で最も人気のライブラリで、サブコマンド、補完、helpメッセージ等のサポートを含んでいる。
- パッケージの追加は
Cargo.toml
に書き足す。
+ [dependencies]
+ clap = { version = "4.0", features = ["derive"] }
- パッケージの追加を行ったら以下を書き足す。
+ use clap::Parser;
use std::path::PathBuf;
+ /// Search for a pattern in a file and display the lines that contain it.
+ #[derive(Parser)]
struct Cli {
+ /// The pattern to look for
pattern: String,
+ /// The path to the file to read
path: PathBuf,
}
-
main
の処理を書き換える
fn main() {
- let pattern = std::env::args().nth(1).expect("no pattern given");
- let path = std::env::args().nth(2).expect("no path given");
- /// structを適用
- let args = Cli {
- pattern,
- path: std::path::PathBuf::from(path),
- };
+ let args = Cli::parse();
println!("pattern: {:?}, path: {:?}", args.pattern, args.path);
}
※parse
メソッドが失敗すると、エラーもしくはヘルプメッセージを出力しプログラムを即時終了する。
-
derive
について
〜WIP〜
https://doc.rust-jp.rs/rust-by-example-ja/trait/derive.html -
-o
や--output
のようなオプションを使いたい場合は#[arg(short = 'o', long = "output")]
を追加する
First implementation of grrs
-
src/main.rs
にファイル読み込み処理を追記
fn main() {
let args = Cli::parse();
+ let content = std::fs::read_to_string(&args.path).expect("could not read file");
println!("pattern: {:?}, path: {:?}", args.pattern, args.path);
}
Exercise
現在の実装だとファイル容量に関わらずファイルをメモリに取り込む為、最適な方法で実装。
〜WIP〜