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

陌路散爱 提交于 2020-01-02 00:57:18

问题


I just started learning Rust, and I'm making some small tools to help me understand the language. I have a problem formatting a String using the format! macro. As format! takes a literal, I am not able pass my string to it. I want to do this to dynamically add strings into the current string for use in a view engine. I'm open for suggestions if there might be a better way to do it.

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

What I actually want to achieve is the below example, where main.html contains {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(())
}

So I want to print the contents of main.html after I formatted it.


回答1:


Short answer: it cannot be done.


Long answer: the format! macro (and its derivatives) requires a string literal, that is a string known at compilation-time. In exchange for this requirement, if the arguments provided do not match the format, a compilation error is raised.


What you are looking for is known as a template engine. A non-exhaustive list of Rust template engines in no particular order:

  • Handlebars
  • Rustache
  • Maud
  • Horrorshow
  • fomat-macros
  • ...

Template engines have different characteristics, and notably differ by the degree of validation occurring at compile-time or run-time and their flexibility (I seem to recall that Maud was very HTML-centric, for example). It's up to you to find the one most fitting for your use case.




回答2:


Check out the strfmt library, it is the closest I've found to do dynamic string formatting.



来源:https://stackoverflow.com/questions/32572486/how-can-i-use-a-dynamic-format-string-with-the-format-macro

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!