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(())
}