2016-06-24 1 views
0

에 대한 루프 내에서 할당되지 않습니다 : 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

오른쪽에있는 문자열이 이미 문자열 일 때 ('to_string()'을 사용하는 경우) 명시적인'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은 사용자가 지정한 순서를 바꿉니다. 빈 시퀀스를 비어 있지 않은 시퀀스로 변환하지 않습니다.

관련 문제