連載
» 2022年02月25日 05時00分 公開

例外によらないエラー処理――Rustのエラー処理を理解する基本からしっかり学ぶRust入門(8)

Rustについて基本からしっかり学んでいく本連載。第8回は、Rustのエラー処理について。

[山内直(著)/山田祥寛(監修),WINGSプロジェクト]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「基礎からしっかり学ぶRust入門」のインデックス

連載:基礎からしっかり学ぶRust入門

 本連載のサンプルコードをGitHubで公開しています。こちらからダウンロードしてみてください。具体的な利用方法は連載第1回を参考にしてください。


 Javaなどでは「例外」としてエラー処理が実装されていますが、Rustのエラー処理は例外という仕組みによらない独特なものです。本連載第8回では、Rustにおけるエラー処理の方法を紹介します。

ファイルの内容を出力する

 エラー処理は、ファイルの入出力において必要となることが多いものです。まずはファイルの読み込みと内容を表示するコードを作成し、エラー処理について検討してみましょう。ここでは、ファイル名をコマンドラインから取り出し、それを実際に読み込み、表示させてみます。

ファイルの読み込みと表示

 コマンドラインで指定されたテキストファイルを読み込み、内容をコンソールに出力するソースコードを以下に示します。

use std::env;                                           (1)
use std::fs::File;
use std::io::prelude::*;
fn main() 
{
    let args: Vec<String> = env::args().collect();      (2)
    let filename = &args[1];
    let mut file = File::open(filename).unwrap();       (3)
    let mut contents = String::new();
    file.read_to_string(&mut contents).unwrap();        (4)
    println!("{}", contents);
}
src/bin/readfile.rs

 (1)はuse文で、幾つかのモジュールを使うという宣言です。Javaにおけるimport文などと同じ位置付けです。std::envモジュールの利用を宣言したことで、(2)のようにコマンドライン引数を取得するargs()メソッドが利用できるようになります。std::fs::Fileは、(3)のFile::open()メソッドのために必要で、std::io::prelude::*は(4)のread_to_string()メソッドのために必要となっています。なお「*」は、その名前空間にあるもの全てという意味です。

【補足】「::」と名前空間

 std::env::args()などの「::」は、モジュールの名前空間を区切るものです。モジュールとは名前空間によって階層化された外部ライブラリで、この場合はstd名前空間のenvモジュールにあるargs()メソッドと理解してください。

 (2)では、コマンドライン引数を、String型のベクタに変換しています。ベクタとは数値によるインデックスでアクセスできるリストのようなものと思ってください(詳しくは次回以降で取り上げます)。これが分かるように、次のargs[1]で2番目のコマンドライン引数(1番目はコマンド自身)を参照として取得し、ファイル名としています。

 (3)では、コマンドラインで指定されたファイル名でファイルをオープンしています。open()メソッドは、他のプログラミング言語と同様にファイルを開くものということは想像できますが、それに続くunwrap()メソッドとは何でしょうか? これについては後述することにして、ここではファイルをオープンするのだと理解してください。

 (4)では、read_to_string()メソッドがString型への変更可能な参照を受け取って、ファイルの内容を全て読み込み、続くprintln!()でそれを全て出力しています。ここにもunwrap()メソッドが出てきています。どうやら、unwrap()メソッドは入出力に絡んだ何かをする、ということのようです。

 ファイルを明示的にクローズする文はありませんが、プログラムの終了とともにクローズされますので問題はありません。

 なお、読み込むファイルとして、以下のようなwagahaiwa_nekodearu.txtというテキストファイルを用意しました。

吾輩は猫である
夏目漱石
 吾輩《わがはい》は猫である。名前はまだ無い。
…後略…
wagahaiwa_nekodearu.txt

 上記のsrc/bin/readfile.rsを実行すると、wagahaiwa_nekodearu.txtの中身が出力されます。

% cargo run --bin readfile wagahaiwa_nekodearu.txt
…中略…
吾輩は猫である
夏目漱石
 吾輩《わがはい》は猫である。名前はまだ無い。
…後略…

【補足】標準入出力を使う

 Rustでも、もちろん標準入出力を使うことができます。散々使ってきたprintln!()も、標準出力への出力を行っています。明示的に標準入出力を使いたい場合には、それぞれstd::io::stdin()メソッド、std::io::stdout()メソッドを使って、File型のオブジェクトを取得します。

存在しないファイルを指定してみる

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。