【问题标题】:Creating a proxy function for a Rust macro为 Rust 宏创建代理函数
【发布时间】:2021-04-22 22:05:05
【问题描述】:

我正在按照这个解决方法来获取信息!,记录!等正在进行测试:

https://stackoverflow.com/a/67105052/5884503

这就是我所做的。我创建了要在我们测试的情况下导入的代理函数,如下所示:

#[cfg(not(test))] 
use log::{info, error}; // Use log crate when building application
#[cfg(test)]
use crate::{info, error}; // Workaround to use prinltn! for logs.

这里是:

#[macro_export]
macro_rules! info {
    (target: $target:expr, $($arg:tt)*) => { println!("target: {}, info: {}", $target, $($arg),*) };
    ($($arg:tt)*) => { println!("info: {}", $($arg),*) };
}

#[macro_export]
macro_rules! error {
    (target: $target:expr, $($arg:tt)*) => { printn!("target: {}, info: {}", $target, $($arg),*) };
    ($($arg:tt)*) => { println!("error: {}", $($arg),*) };
}

然后我这样调用:

       error!("Unauthorized message has authentication header but WwwAuthenticate fails to parse. RTSP Message: {:?}", message);

但我明白了:

error: expected expression, found `,`
   --> src/rtsp_machine.rs:440:96
    |
440 |                     "Unauthorized message has no AuthenticationInfo header. RTSP Message: {:?}",
    |                                                                                                ^ expected expression

宏参数中的重复有问题,但我不知道具体是什么

【问题讨论】:

    标签: rust macros


    【解决方案1】:

    您没有指定用逗号分隔参数的可能性,因此 "expected expression, found ," 错误。

    您还必须包含format!,因为生成的println! 的第一个参数不是格式链。

    然后,还可以使用 $(,)? 部分将最后一个逗号设为可选,我可以将您的宏更改为:

    #[macro_export]
    macro_rules! error {
        (target: $target:expr $(,$arg:tt)*) => { println!("target: {}, info: {}", $target, format!($($arg,)*)) };
        ($($arg:tt),*$(,)?) => { println!("error: {}", format!($($arg,)*)) };
    }
    

    示例:

    fn main() {
        error!(target: "my target" , " thing={:?}", "test");
        error!("bla={} and bit={}", 54, 7);
    }
    

    会打印

    target: my target, info:  thing="test"
    error: bla=54 and bit=7
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-09
      • 2010-11-21
      • 1970-01-01
      • 2020-07-20
      • 2023-03-27
      • 2014-06-15
      • 1970-01-01
      • 2020-04-17
      相关资源
      最近更新 更多