2015-09-14 9 views
9

私はちょうど錆を学び始めました。私は言語を理解するのに役立つ小さなツールを作っています。 format!マクロを使用してStringの書式設定に問題があります。 format!はリテラルを取るので、私はそれに文字列を渡すことができません。私は動的にビューエンジンで使用するために現在の文字列に文字列を追加するこれを行うには。私はそれを行うより良い方法があるかもしれないなら、提案のために開いている。フォーマットでダイナミックフォーマット文字列を使用するにはどうすればいいですか?マクロ?

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の内容を出力したいと思います。

+0

おそらく、http://stackoverflow.com/questions/28333612/how-can-i-append-a-formatted-string-to-an-existing-stringの複製です。 – Shepmaster

+1

@Shepmaster:重複していません。これはもう一つの方法です:フォーマット文字列はこの質問の動的ビットです。 –

答えて

5

短い答え:できません。


長い答え:format!マクロ(およびその誘導体)は、それがコンパイル時に知られている文字列で、文字列リテラルが必要です。この要件と引き換えに、提供された引数がフォーマットと一致しない場合、コンパイルエラーが発生します。


お探しのものは、テンプレートエンジンと呼ばれています。順不同で錆のテンプレートエンジンの非網羅的なリスト:

テンプレートエンジンはさまざまな特性を持ちますが、コンパイル時や実行時のバリデーションの程度や柔軟性によって大きく異なります(たとえば、MaudはHTML中心です)。あなたのユースケースに最も適したものを見つけることはあなた次第です。

+0

ご返信ありがとうございます。私は錆を学ぶためにこれをやっているので、私は代わりに代わりに行くつもりだと思うが、何か具体的なものではない。 – Sune

1

strfmtライブラリをチェックしてください。これは、ダイナミックな文字列の書式設定に最も近いライブラリです。