2016-06-21 6 views
-1
fn lyrics_more_bottles(song_template: &mut String, number: i32) { 
    let mut template_partials = HashMap::new(); 
    let mut start_num = number.to_string(); 
    let mut remaining_num = (number - 1).to_string(); 

    template_partials.insert("start", start_num + " bottles"); 
    template_partials.insert("repeat", start_num + " bottles"); 
    template_partials.insert("remaining", remaining_num + " bottles"); 
    template_partials.insert("message", "Take one down and pass it around"); 

    resolve_template(song_template, template_partials); 
} 

これらの連結文字列を&strに変換することはできません。私はかっこに入れて、.as_str()に電話しました。それに運がない。concat文字列を&strに変換します

私はHashMap<&str, &str>を持っている必要がありますので、Stringはオプションではありません。

答えて

2

この機能から&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() {} 

我々 &*DerefStringstrと入力し、もう一度参考にして&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() {} 
+0

感謝を!あなたのフォーマット!()のアイデアが私を最大限に助けました:D私はそれについて完全に忘れました – xetra11

関連する問題