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

问题描述 投票:0回答:3

我想使用带有

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的内容。

string format rust literals
3个回答
37
投票

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


长答案:

format!
宏(及其衍生物)需要一个字符串文字,即编译时已知的字符串。作为此要求的交换,如果提供的参数与格式不匹配,则会引发编译错误。


您正在寻找的东西被称为模板引擎。 Rust 模板引擎的非详尽列表(排名不分先后):

模板引擎具有不同的特征,并且在编译时或运行时发生的验证程度及其灵活性方面显着不同(例如,我似乎记得 Maud 非常以 HTML 为中心)。您可以找到最适合您的用例的一个。


12
投票

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


0
投票

我看了很多板条箱,但与简单的

format!
相比,这些库都非常复杂。尝试做比实际需要更复杂的事情。

唯一几乎可以替代

format!
的是 dyn-fmt

© www.soinside.com 2019 - 2024. All rights reserved.