Macro nar_dev_utils::show

source ·
macro_rules! show {
    ($e:expr) => { ... };
    ($e:expr;) => { ... };
    ($($e:expr),+ $(,)?) => { ... };
    ($($e:expr),+ $(,)?;) => { ... };
}
Expand description

§show!:复现Julia的@show

  • 🎯复刻Julia中常用的宏@show 表达式
    • 相当于Julia@show(表达式),但功能更强大
  • 📌核心:打印表达式 = 值,并(可选地)返回表达式的值
    • 🚩只有一个表达式⇒计算、打印并返回表达式的值
    • 🚩多个表达式⇒计算、打印并返回表达式值的元组 | Julia则是返回最后一个值
    • 🚩一个表达式+尾缀分号⇒计算并打印,不返回
    • 🚩多个表达式+尾缀分号⇒批量计算并打印,不返回任何值(并且无运行时损耗)
  • ✅允许尾缀逗号
  • 📝对于文档测试,必须自包名导入相应的宏以便进行测试
  • 🔗亦可参考其它实现如show

§用例

use nar_dev_utils::show;
fn see<'a>(v: &'a str, v2: &'a str) -> (&'a str, &'a str) {
    // 用`show!`打印`v`、`v2`,不返回值
    show!(&v, &v2;);
    // 用`show!`打印`v`,并返回其值
    show!(v, v2)
}

将被转换为

fn see<'a>(v: &'a str, v2: &'a str) -> (&'a str, &'a str) {
    // 用`show!`打印`v`、`v2`,不返回值
    println!("{} = {:?}", "&v", (&v));
    println!("{} = {:?}", "&v2", (&v2));
    // 用`show!`打印`v`,并返回其值
    (
        {
            let value = v;
            println!("{} = {:?}", "v", value);
            value
        },
        {
            let value = v2;
            println!("{} = {:?}", "v2", value);
            value
        },
    )
}

调用see("我是一个值", "我是另一个值")将输出

&v = "我是一个值"
&v2 = "我是另一个值"
v = "我是一个值"
v2 = "我是另一个值"

并返回("我是一个值", "我是另一个值")