この機能から&str
を返す必要がある場合は、不運です。Return local String as a slice (&str)を参照してください。
場合だけHashMap
にスライスを入れて、あなたがどこかString
Sを保存し、String
Sへの参照を持つマップを入力する必要があり、さらに下にそれを渡す必要があります。
use std::collections::HashMap;
fn resolve_template(_: &mut String, _: HashMap<&str, &str>) {}
fn lyrics_more_bottles(song_template: &mut String, number: i32) {
let mut start_num = number.to_string();
let mut remaining_num = (number - 1).to_string();
let start = start_num.clone() + " bottles";
let repeat = start_num + " bottles";
let remaining = remaining_num + " bottles";
let mut template_partials = HashMap::new();
template_partials.insert("start", &*start);
template_partials.insert("repeat", &*repeat);
template_partials.insert("remaining", &*remaining);
template_partials.insert("message", "Take one down and pass it around");
resolve_template(song_template, template_partials);
}
fn main() {}
我々 &*
〜Deref
をString
〜str
と入力し、もう一度参考にして&str
にしてください。
の後にの文字列が作成されていなければなりません。それ以外の場合は、文字列が削除されたときに無効なメモリへの参照が含まれている可能性があります。さらに、start_num
は2回使用されるのでクローンを作成する必要があります。
個人的に、私はちょうどformat!
を使用したいとクローニングの倍の代わりに同じ文字列を使用し、二回、それを修正する:
use std::collections::HashMap;
fn resolve_template(_: &mut String, _: HashMap<&str, &str>) {}
fn lyrics_more_bottles(song_template: &mut String, number: i32) {
let start_and_repeat = format!("{} bottles", number);
let remaining = format!("{} bottles", number - 1);
let mut template_partials = HashMap::new();
template_partials.insert("start", &*start_and_repeat);
template_partials.insert("repeat", &*start_and_repeat);
template_partials.insert("remaining", &*remaining);
template_partials.insert("message", "Take one down and pass it around");
resolve_template(song_template, template_partials);
}
fn main() {}
感謝を!あなたのフォーマット!()のアイデアが私を最大限に助けました:D私はそれについて完全に忘れました – xetra11