macro_rules! if_return {
{
$condition:expr $(=> $return_value:expr)?
} => { ... };
{
$($condition:expr $(=> $return_value:expr)?)*
} => { ... };
}Expand description
简化「if 条件 {return 值;}」的控制流
- 📄形式:
if_return![a == 1 => 2]=>if a == 1 {return 2;}
§Examples
use nar_dev_utils::if_return;
fn starts_at(text: &str, prefix: &str) -> Option<usize> {
// 截断式返回示例:多分支
if_return! {
prefix.is_empty() => Some(0)
text.starts_with(prefix) => Some(0)
}
let mut i = 0;
let max_i = text.len() - prefix.len();
while i <= max_i {
// 截断式返回示例:单分支 | 三行变一行
if_return! { prefix == &text[i..(i + prefix.len())] => Some(i) }
i += 1;
}
None
}
assert_eq!(starts_at("hello", ""), Some(0));
assert_eq!(starts_at("hello", "llo"), Some(2));
assert_eq!(starts_at("hello", "help"), None);use nar_dev_utils::if_return;
fn raise_the_bar(num: usize, bar: &mut usize) {
#![allow(clippy::unused_unit)]
*bar = 0;
// 截断式返回示例:隐式指定返回值(单元类型`()`)
if_return! { num <= *bar }
println!("{num} is greater than {bar}");
*bar = 1;
// 截断式返回示例:上述「隐式返回」与此处「显式返回」等价
if_return! { num <= *bar => () }
println!("{num} is greater than {bar}");
*bar = 2;
}
let mut num = 0;
let mut bar = 0;
raise_the_bar(num, &mut bar);
assert_eq!(bar, 0);
num = 1;
raise_the_bar(num, &mut bar);
assert_eq!(bar, 1);
num = 2;
raise_the_bar(num, &mut bar);
assert_eq!(bar, 2);