面试题答案
一键面试// 定义日志记录宏
macro_rules! log_message {
($msg:expr) => {
{
use std::time::SystemTime;
let now = SystemTime::now()
.duration_since(SystemTime::UNIX_EPOCH)
.expect("Time went backwards")
.as_secs();
println!("[{}] {}", now, $msg);
}
};
}
宏定义各部分含义
macro_rules! log_message
:定义一个名为log_message
的宏。($msg:expr)
:定义宏的参数,这里$msg
是参数名,:expr
表示该参数是一个表达式,意味着我们可以传入任何合法的Rust表达式,在本题中传入字符串。=>
:分隔宏的模式匹配部分和替换部分。{}
:替换部分的代码块。use std::time::SystemTime;
:引入SystemTime
模块用于获取当前时间。let now = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).expect("Time went backwards").as_secs();
:获取当前时间距离Unix纪元的秒数。println!("[{}] {}", now, $msg);
:格式化输出当前时间和传入的字符串信息。
宏展开过程
当代码中使用log_message!("Hello, world!");
时,宏会进行如下展开:
- 模式匹配
($msg:expr)
与"Hello, world!"
匹配成功,$msg
被替换为"Hello, world!"
。 - 替换部分的代码块被插入到调用宏的位置,即变为:
{
use std::time::SystemTime;
let now = SystemTime::now()
.duration_since(SystemTime::UNIX_EPOCH)
.expect("Time went backwards")
.as_secs();
println!("[{}] {}", now, "Hello, world!");
}
然后这段代码就像普通的Rust代码一样被编译和执行,在控制台输出当前时间加上传入的字符串信息。