我该如何使用动态格式字符串与format!宏?

49

我想使用带有format!宏的String作为第一个参数,但是由于该宏期望一个字符串字面量,因此我无法传递任何不同的内容。

我想动态地将字符串添加到当前字符串中,以在视图引擎中使用。如果有更好的方法,我愿意听取建议。

let test = String::from("Test: {}");
let test2 = String::from("Not working!");
println!(test, test2);

我真正想要实现的是以下示例,其中main.html包含{content}

use std::io::prelude::*;
use std::fs::File;
use std::io;

fn main() {
    let mut buffer = String::new();
    read_from_file_using_try(&mut buffer);

    println!(&buffer, content="content");
}

fn read_from_file_using_try(buffer: &mut String) -> Result<(), io::Error> {
    let mut file = try!(File::open("main.html"));
    try!(file.read_to_string(buffer));
    Ok(())
}

所以我想在格式化后打印main.html的内容。


可能是 https://dev59.com/F14c5IYBdhLWcg3wFW6N 的重复问题。 - Shepmaster
2
@Shepmaster:不是重复;相反,格式字符串是这个问题中的动态部分。 - Chris Morgan
3个回答

42

简短回答:这是不可能的。


详细回答:`format!`宏及其衍生版本需要一个字符串字面量,也就是在编译时已知的字符串。作为交换条件,如果提供的参数与格式不匹配,则会引发编译错误。


你正在寻找的是模板引擎。以下是一些 Rust 模板引擎的非全面列表,排列顺序不分先后:

模板引擎具有不同的特性,主要是由编译时或运行时发生的验证程度和它们的灵活性(例如,我似乎记得 Maud 是非常面向 HTML 的)。你需要找到最适合你使用情况的模板引擎。


2
谢谢您的回复。我想我会选择使用替换,因为我正在学习 Rust,而不是为了某个特定的目的。 - Sune

12

看看strfmt库,这是我发现的最接近动态字符串格式化的库。


0
我看了很多库,但是相比于简单的format!,它们都非常复杂。试图做比实际需要更复杂的事情。
唯一一个几乎可以替代format!的是dyn-fmt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接