Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

match 脱糖の再発明

特定のfeatureが有効時に .unwrap() にする にて consume-question feature有効時に ! を使うことで ? を別なものに置換できることを示しました。

これを利用すると ?match に置き換えることも可能です。 match 脱糖の再発明ですね。面白い例なので載せておこうと思います。

まず、忘れずに consume-question を有効にしておいてください。

cargo add hooq --features consume-question

hooq.tomlにて置換結果となる match 式を定義します。 $expr が置換元の式を表します!フレーバー名ですが、 match は予約語なので my_match としています。

[my_match]
method = """
match $expr {
    Ok(val) => val,
    Err(err) => return Err(From::from(err)),
}!
"""

後は、いつも通りmain.rsを書くだけです。ただし再発明はClippyに怒られる可能性があるので、一応 #[allow(clippy::question_mark)] を関数の頭に付けましょう。

use hooq::hooq;

fn failable<T>(val: T) -> Result<T, String> {
    Ok(val)
}

#[hooq(my_match)]
#[allow(clippy::question_mark)]
fn main() -> Result<(), String> {
    let _ = failable(42)?;

    Ok(())
}

展開結果においては狙い通り match 式になっています!

#![feature(prelude_import)]
#[macro_use]
extern crate std;
#[prelude_import]
use std::prelude::rust_2024::*;
use hooq::hooq;
fn failable<T>(val: T) -> Result<T, String> {
    Ok(val)
}
#[allow(clippy::question_mark)]
fn main() -> Result<(), String> {
    let _ = match failable(42) {
        Ok(val) => val,
        Err(err) => return Err(From::from(err)),
    };
    Ok(())
}