ファイルの読み込み

RustRustBeginner
今すぐ練習

This tutorial is from open-source community. Access the source code

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

ファイルの読み込みへようこそ。この実験は、Rust Bookの一部です。LabExでRustのスキルを練習することができます。

この実験では、fs::read_to_stringメソッドを使ってfile_path引数で指定されたファイルを読み込む機能を追加し、その後、ファイルの内容を表示します。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust(("Rust")) -.-> rust/DataStructuresandEnumsGroup(["Data Structures and Enums"]) rust/BasicConceptsGroup -.-> rust/variable_declarations("Variable Declarations") rust/DataTypesGroup -.-> rust/string_type("String Type") rust/FunctionsandClosuresGroup -.-> rust/function_syntax("Function Syntax") rust/FunctionsandClosuresGroup -.-> rust/expressions_statements("Expressions and Statements") rust/DataStructuresandEnumsGroup -.-> rust/method_syntax("Method Syntax") subgraph Lab Skills rust/variable_declarations -.-> lab-100419{{"ファイルの読み込み"}} rust/string_type -.-> lab-100419{{"ファイルの読み込み"}} rust/function_syntax -.-> lab-100419{{"ファイルの読み込み"}} rust/expressions_statements -.-> lab-100419{{"ファイルの読み込み"}} rust/method_syntax -.-> lab-100419{{"ファイルの読み込み"}} end

ファイルの読み込み

次に、file_path引数で指定されたファイルを読み込む機能を追加します。まずはテスト用のサンプルファイルが必要です。複数行にわたる少量のテキストといくつかの繰り返し語を含むファイルを使います。リスト12-3にはエミリー・ディキンソンの詩があり、これがうまく機能します!プロジェクトのルートレベルに_poem.txt_という名前のファイルを作成し、「I'm Nobody! Who are you?」という詩を入力してください。

ファイル名:poem.txt

I'm nobody! Who are you?
Are you nobody, too?
Then there's a pair of us - don't tell!
They'd banish us, you know.

How dreary to be somebody!
How public, like a frog
To tell your name the livelong day
To an admiring bog!

リスト12-3:エミリー・ディキンソンの詩は良いテストケースになります。

テキストを用意したら、src/main.rsを編集して、ファイルを読み込むコードを追加します。リスト12-4を参照してください。

ファイル名:src/main.rs

use std::env;
1 use std::fs;

fn main() {
    --snip--
    println!("In file {}", file_path);

  2 let contents = fs::read_to_string(file_path)
       .expect("Should have been able to read the file");

  3 println!("With text:\n{contents}");
}

リスト12-4:2番目の引数で指定されたファイルの内容を読み込む

まず、use文で標準ライブラリの関連部分をインポートします。ファイルを扱うにはstd::fsが必要です[1]。

main関数では、新しい文fs::read_to_stringfile_pathを受け取り、そのファイルを開き、ファイルの内容のstd::io::Result<String>を返します[2]。

その後、ファイルを読み込んだ後のcontentsの値を表示する一時的なprintln!文を再度追加します。これにより、これまでのプログラムが正常に動作していることを確認できます[3]。

最初のコマンドライン引数に任意の文字列を指定し(検索部分はまだ実装していないため)、2番目の引数に_poem.txt_ファイルを指定してこのコードを実行してみましょう。

$ cargo run -- the poem.txt
   Compiling minigrep v0.1.0 (file:///projects/minigrep)
    Finished dev [unoptimized + debuginfo] target(s) in 0.0s
     Running `target/debug/minigrep the poem.txt`
Searching for the
In file poem.txt
With text:
I'm nobody! Who are you?
Are you nobody, too?
Then there's a pair of us - don't tell!
They'd banish us, you know.

How dreary to be somebody!
How public, like a frog
To tell your name the livelong day
To an admiring bog!

素晴らしい!コードはファイルを読み込み、その内容を表示しました。しかし、このコードにはいくつかの欠点があります。現在のところ、main関数は複数の責務を担っています。一般的には、各関数が1つの機能のみを担当する方が、関数が明確で保守しやすくなります。もう1つの問題は、エラー処理が十分ではないことです。プログラムはまだ小さいので、これらの欠点は大きな問題ではありませんが、プログラムが拡大するにつれて、これらをきれいに修正するのは難しくなります。プログラムを開発する際は、早期にリファクタリングを始めるのが良い練習です。なぜなら、少量のコードをリファクタリングする方がはるかに簡単だからです。次にそれを行います。

まとめ

おめでとうございます!ファイルの読み込みの実験を完了しました。LabExでさらに多くの実験を行って、スキルを向上させることができます。