如何在格式中使用动态格式字符串!宏观?

How can I use a dynamic format string with the format! macro?

提问人:Sune 提问时间:9/15/2015 最后编辑:hellowSune 更新时间:8/14/2023 访问量:19779

问:

我想使用带有 a as first 参数的宏,但由于宏需要字符串文字,因此我无法向它传递任何不同的东西。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 的内容。

字符串 格式 Rust 文字

评论

0赞 Shepmaster 9/15/2015
可能是 stackoverflow.com/questions/28333612/ 的复制品......
2赞 Chris Morgan 9/15/2015
@Shepmaster:不重复;反之亦然:格式字符串是这个问题中的动态位。

答:

42赞 Matthieu M. 9/15/2015 #1

简短的回答:这是做不到的。


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


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

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

评论

2赞 Sune 9/15/2015
感谢您的回复。我想我会改用替换,因为我这样做是为了学习生锈,而不是为了特定的东西。
12赞 opensourcegeek 11/30/2016 #2

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

0赞 Jan Diederich 8/14/2023 #3

我看了很多板条箱,但与简单的 .试图做比真正需要的更复杂的事情。format!

唯一一个几乎可以替代的是 dyn-fmtformat!