-
Notifications
You must be signed in to change notification settings - Fork 0
Rust元编程
chlict edited this page Apr 26, 2020
·
1 revision
html的例子
# #![allow(unused_must_use)]
macro_rules! write_html {
($w:expr, ) => (());
($w:expr, $e:tt) => (write!($w, "{}", $e));
($w:expr, $tag:ident [ $($inner:tt)* ] $($rest:tt)*) => {{
write!($w, "<{}>", stringify!($tag));
write_html!($w, $($inner)*);
write!($w, "</{}>", stringify!($tag));
write_html!($w, $($rest)*);
}};
}
fn main() {
# // FIXME(#21826)
use std::fmt::Write;
let mut out = String::new();
write_html!(&mut out,
html[
head[title["Macros guide"]]
body[h1["Macros are the best!"]]
]);
assert_eq!(out,
"<html><head><title>Macros guide</title></head>\
<body><h1>Macros are the best!</h1></body></html>");
}
过程宏
宏也有库:syn和quote
也就是说,在编译器处理到 hw! 宏的时候会将 hw! 所有参数打包为 TokenStream 交给上面定义的函数执行,然后用返回的 TokenStream 替换掉原先宏所占据的源码位置。