2016-06-24 7 views
0

にforループ内に割り当てられません:I出力verse(1)として文字列の戻り値は、このコード・スニペットを考えると錆

pub fn verse(start_bottles: i32) -> String { 
    let mut song_template: String = "%1 of beer on the wall, %2 of beer.\n%3, %4 of beer on the wall.\n".to_string(); 

    match start_bottles { 
     0 => lyrics_no_bottles(&mut song_template), 
     1 => lyrics_one_bottle(&mut song_template), 
     2 => lyrics_two_bottles(&mut song_template), 
     _ => lyrics_more_bottles(&mut song_template, start_bottles) 
    } 
    song_template 
} 

pub fn sing(first: i32, last: i32) -> String { 
    let mut song: String = "".to_string(); 
    for num in (8..6).rev() { 
     song = verse(1); 
    } 
    song 
} 

それが正常に動作 - テストした文字列が表示され、完了です。しかし、verse(1)の結果をStringバインディングsongに割り当てると、songは空に見えますか?私はこの行動を理解していません。

+1

右辺が既に文字列であるときに、それらの明示的な 'String'型の注釈を削除することができます(' to_string() 'を使用している場合)。 )。 –

+0

私は可読性のために保管しています...すべてのケースで多くの推論が好きではありません...常にタイプを見たいと思っています – xetra11

+1

私はそれを完全に理解することができますが、コミュニティ内のコーディングスタイルたとえそれが新しい言語の人にとって間違っているとしても、誰もがほかの人のコードをすばやく読むことができます。しかし、これはSOのコメントのセクションで解決するものではありません:) –

答えて

6

これは範囲の仕組みではないためです。それは文字列とは関係がありません。あなたは次のことを実行する場合:

fn main() { 
    for i in 8..6 { 
     println!("a: {}", i); 
    } 
    for i in (8..6).rev() { 
     println!("b: {}", i); 
    } 
    for i in 6..8 { 
     println!("c: {}", i); 
    } 
    for i in (6..8).rev() { 
     println!("d: {}", i); 
    } 
} 

あなたは次のような出力が得られます。

c: 6 
c: 7 
d: 7 
d: 6 

のみカウントアップを範囲、彼らはカウントダウンはありません。 revは、指定したシーケンスの順序を逆にします。空のシーケンスを空でないシーケンスに変換しません。

関連する問題