Rust如何创建可后续传入参数插值的format!兼容字符串模板
解决方案
首先明确一个前提:Rust 的 format! 系列宏是编译期执行的,它要求第一个格式参数必须是编译期可确定的字符串字面量,你从服务端运行时获取的动态 String 不可能直接作为 format! 的格式参数使用,因此你需要用运行时字符串替换的方案来实现需求。
针对你当前只有1个插值占位符的场景,完全可以不用引入任何第三方库,用原生字符串方法就能实现极简的满足需求的方案:
步骤1:统一模板占位符格式
你只需要和服务端约定统一用 {} 作为唯一的插值占位符即可,默认模板也对齐这个规则:
#[derive(Serialize,Deserialize,Clone,Debug)] struct Message { text: String } impl Default for Message { fn default() -> Self { Self { text: "Hello {}, how are you?".to_string() } } }
步骤2:实现插值方法
给 Message 结构体实现一个轻量的渲染方法,直接替换占位符即可:
impl Message { /// 传入参数完成模板插值,仅替换第一个`{}`占位符 pub fn render(&self, param: &str) -> String { self.text.replacen("{}", param, 1) } }
步骤3:调用示例
let my_message: Message = get_message_template(); // 完成插值得到最终字符串 let final_text = my_message.render("John");
方案优势
- 无任何额外依赖,比引入重型模板库轻量非常多
- 完全匹配你当前单占位符的需求,
replacen指定替换1次,即使模板意外出现多个{}也不会出错 - 容错性高,就算服务端返回的模板没有占位符,也会直接返回原字符串不会报错
如果后续你需要支持多占位符的场景,也可以基于这个思路扩展替换规则即可,不用引入重型模板库。
内容的提问来源于stack exchange,提问作者Avba
相关产品推荐
相关产品推荐

