時には、プログラムが動的値を含むメッセージをユーザーにフレーズする方法はたくさんあります。たとえば:ランダムにフォーマット文字列を選択する方法
- "{}分残っています。"
- "{分}以内に完了する必要があります。
すべてのメッセージに単なる接頭辞または接尾辞として値が含まれているわけではありません。動的言語では、これは文字列フォーマットの論理的な仕事と思われます。
pub fn h(x: usize) -> String {
rand::sample(rand::thread_rng(), vec![
format!("{} minutes remain.", x),
format!("Hurry up; only {} minutes left to finish.", x),
format!("Haste advisable; time ends in {}.", x),
/* (insert many more elements here) */
], 1).first().unwrap_or(format!("{}", x))
}
は次のようになります:
反復が望ましくないメディアの場合(例えばスラックチャネル)のようなものを使用して出力し、各最終String
を生産する非常に多くの異なるフレージングがあります
- 退屈に毎回
format!(/*...*/, x)
と入力してください。 - 1つの可能性がすべて選択される前に完全に生成され、他のものは破棄されるため、メモリ+クロックサイクルが無駄になります。
これらの欠点を回避する方法はありますか?
フォーマット文字列のコンパイル時の評価ではなく、ランダムに選択された&'static str
(静的スライスから)を返してformat!
に渡す関数が好ましい解決策でした。
関連:[私はどのようにフォーマットでダイナミックフォーマット文字列を使用できますか?マクロ?](http://stackoverflow.com/q/32572486/155423)。 – Shepmaster
数値を無作為に生成し、 'match'を使ってフォーマットする文字列を選ぶことを考えましたか?それは、すべての文字列を生成してからそれらを投げ捨てることを避けるでしょう。 – Aurora0001