我有很多不同范围的数据集,我需要插入到表中。紫杉太过分了,只是为了接吻。如
//format!("<tr><td>{e1}</td><td>{e2}</td></tr>") – no good, might be exprs
format!("<tr><td>{}</td><td>{}</td></tr>", e1, e2)
我想简化任意数量的列
macro_rules! tr {
($($td:expr),*) => {
format!(concat!("<tr>", $("<td>{}</td>"),* "</tr>"), $($td),*)
}
}
tr!(e1, e2)
给出错误:尝试重复不包含与此深度重复匹配的语法变量的表达式
所以我尝试了一个人工代码块,只是为了在第一次重复中给它变量
macro_rules! tr {
($($td:expr),*) => {
format!(concat!("<tr>", $({ $td; "<td>{}</td>" }),* "</tr>"), $($td),*)
}
}
给出错误:预期 token :,
正确的语法是什么?
最佳答案
当您需要与元变量重复某些表达式但不将其包含在表达式中时,有一个技巧:定义一个内部宏arm/另一个内部宏,它接受元变量并生成常量表达式。这样,您就可以在 reptition 中“使用”元变量,而无需实际包含它:
macro_rules! tr {
(@trick $td:expr) => { "<td>{}</td>" };
($($td:expr),*) => {
format!(concat!("<tr>", $(tr!(@trick $td),)* "</tr>"), $($td),*)
}
}
在夜间,有一个更简单的方法:使用 ${ignore(...)}
修饰符正是为此目的:
#![feature(macro_metavar_expr)]
macro_rules! tr {
($($td:expr),*) => {
format!(concat!("<tr>", $("<td>{}</td>", ${ignore(td)})* "</tr>"), $($td),*)
}
}
关于html - 如何创建 <tr><td> 宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74459580/