Rust の Result 型エイリアスでコードを簡潔にする

Rust の std::io モジュールの関数は、戻り値として Result<T, std::io::Error> 型のオブジェクトを返すのですが、Result::Err バリアント部分の型は std::io::Error でいつも同じなので、簡潔に記述できるように、次のような std::io::Result というエイリアス型が定義されています。

std::io::Result
pub type Result<T> = Result<T, Error>;  // 後ろの Error は std::io::Error

ここで定義している Result 型は、基礎となる std::result::Result とは別物なので注意してください。 std::io::Result という型を、std::result::Resultstd::io::Error を組み合わせて定義しています。

std::io::Result を使うと、例えば、String を成功値 (Ok バリアントのフィールド) とする Result は、io::Result<String> と簡潔に記述することができます。 下記が具体的な使用例です。

use std::io;

/// 標準入力から 1 行読み込みます
fn get_string() -> io::Result<String> {
    let mut buffer = String::new();
    io::stdin().read_line(&mut buffer)?;
    Ok(buffer)
}

上記の get_string() 関数の戻り値の型 io::Result<String> は、実際には std::result::Result<String, std::io::Error> と同等です。

関数の処理が成功したときに値を返す必要がない(Ok バリアントのデータが必要ない)場合は、もっとシンプルに io::Result<()> という型になります。

fn foo() -> io::Result<()> {
    // ...
    Ok(())
}

Result<()> といった表現が出てきた場合、どこかにこういったエイリアス型が定義されているはずです。