TAKOYAKING’s blog 一覧

TAKOYAKING’s blog

たこ焼き系

Rust: エラー処理のための「Try!」と「?」

try!入門 | Rust by Example
こちらのサンプルコードで

fn setup() -> std::io::Result<()> {
    let mut a = try!(File::create("a"));
    try!(a.write_all(b"grape"));

    let mut b = try!(File::create("b"));
    b.write_all(b"fruit")
}

を実行すると

expected expression, found reserved keyword `try`

が出てしまいました。

環境

rustc 1.40.0

原因

サンプルコードは古いRustなのですが、今現在、新しい記法になっているためです。

対処方法

1. try!の代わりに「?」をつける
fn setup() -> std::io::Result<()> {
    let mut a = File::create("a")?;
    a.write_all(b"grape")?;

    let mut b = File::create("b")?;
    b.write_all(b"fruit")
}

try!の代わりに「?」が導入されているので手軽にエラー処理を行うことができます。

2. try!の代わりに「r#try!」をつける
fn setup() -> std::io::Result<()> {
    let mut a = r#try!(File::create("a"));
    try!(a.write_all(b"grape"));

    let mut b = r#try!(File::create("b"));
    b.write_all(b"fruit")
}

r#をつけることでtry!マクロをギリギリまだ使用できるみたいです。

感想

「?」便利だけどなんと呼べばいいのかわからないので「はてな」と呼べば良いのでしょうか?

tryが予約語になっていた理由ですが、
rfcs/2388-try-expr.md at master · rust-lang/rfcs · GitHub
ここに書いてあって、色々議論された故の予約語だったようです。