html - 如何创建 <tr><td> 宏?

标签 html rust macros

我有很多不同范围的数据集,我需要插入到表中。紫杉太过分了,只是为了接吻。如

//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/

相关文章:

Css 过渡 div 晃动

html - 将表单中心的标签放置在 twitter bootstrap 中

php - 将 HTML (tinyMCE) 转换为 WORD (.docx)

rust - 如何使用 TryFrom 将 usize 转换为 u32?

rust - 无法使此宏规则编译 : type annotation needed

macros - 有关Clojure namespace 和宏的问题

javascript - 溢出自动div重叠Bootstrap日期时间选择器

rust - |难以汇总匹配|

Emacs 停止标记区域而不使用键盘退出

macros - clojure - 以非普通方式扩展类型