Open12

Learn | Rust

TakayyzTakayyz

構文調べる

use ferris_says::say;
TakayyzTakayyz

crateは自分のファイルで定義したcrateを呼び出したい場合?

crate::hoge::piyo();

crates.ioで公開されているcrateを呼び出したい場合はcrateを含めなくて良さそう。

hoge::piyo();
TakayyzTakayyz
通常のコメント これはコンパイラによって完全に無視されます。
// 行末までコメントアウト
/* ブロックによって囲まれた部分をコメントアウト */
ドキュメンテーションコメント ライブラリのドキュメンテーションとしてhtmlにパースされます。
/// このコメントの下の内容に関するドキュメントとなります
//! このコメントを含むソースのドキュメントになります
TakayyzTakayyz
TakayyzTakayyz

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()

標準ライブラリが持つ関数で、渡された引数のイテレーターを取得できる。
https://doc.rust-lang.org/1.39.0/std/env/fn.args.html

TakayyzTakayyz

引数で渡されるデータの構造を定義する。

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

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メソッドが失敗すると、エラーもしくはヘルプメッセージを出力しプログラムを即時終了する。

TakayyzTakayyz

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

Exercise

現在の実装だとファイル容量に関わらずファイルをメモリに取り込む為、最適な方法で実装。
WIP