【问题标题】:How can I use a dynamic format string with the format! macro?如何使用带有格式的动态格式字符串!宏?
【发布时间】:2021-11-25 07:40:49
【问题描述】:

我想使用带有Stringformat! 宏作为第一个参数,但是因为宏需要一个字符串文字,所以我不能传递任何不同的东西。

我想这样做是为了将字符串动态添加到当前字符串中,以便在视图引擎中使用。如果有更好的方法,我愿意提供建议。

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


【解决方案1】:

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


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


您正在寻找的就是所谓的模板引擎。不完整的 Rust 模板引擎列表,不分先后:

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

【讨论】:

  • 感谢您的回复。我想我会用替换来代替,因为我这样做是为了学习 rust 而不是为了特定的东西。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-18
    • 2021-08-09
    • 2019-07-14
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多