String 未在Rust中的for循环中指定字符串返回值

String 未在Rust中的for循环中指定字符串返回值,string,for-loop,rust,variable-assignment,String,For Loop,Rust,Variable Assignment,给定此代码段: 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_t

给定此代码段:

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
}

当我输出
诗句(1)
时,它工作正常-测试的字符串出现并完成。但是,当我将
第(1)节的结果分配给
字符串
绑定
歌曲
时,
歌曲
似乎是空的?我不理解这种行为。

因为范围不是这样工作的;这与弦无关。如果运行以下命令:

fn main(){
因为我在8.6{
println!(“a:{}”,i);
}
对于(8..6).rev()中的i{
println!(“b:{}”,i);
}
我在6…8{
println!(“c:{}”,i);
}
对于(6..8).rev()中的i{
println!(“d:{}”,i);
}
}
您将获得以下输出:

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

范围只向上计数,从不向下计数
rev
反转您给定的顺序;它不会将空序列转换为非空序列。

因为范围不是这样工作的;这与弦无关。如果运行以下命令:

fn main(){
因为我在8.6{
println!(“a:{}”,i);
}
对于(8..6).rev()中的i{
println!(“b:{}”,i);
}
因为我在6.8{
println!(“c:{}”,i);
}
对于(6..8).rev()中的i{
println!(“d:{}”,i);
}
}
您将获得以下输出:

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

范围只向上计数,从不向下计数
rev
反转您给定的顺序;它不会将空序列转换为非空序列。

只是关于代码的注释,与问题无关:当您的右手边已经是字符串时,您可以删除那些显式的
字符串
类型注释(在使用
to_String()
的情况下).我保留它是为了可读性…我不太喜欢每种情况下的推理…想随时查看类型我完全理解,但在社区中确定一种编码风格是非常重要的,这样每个人都可以快速阅读其他人的代码,即使对于一种语言的新手来说感觉不对。但在SO comment部分,这并不是什么需要解决的问题:)只是关于代码的注释,与问题无关:当您的右手边已经是字符串时,您可以删除那些显式的
String
类型注释(使用
to_String()
).我保留它是为了可读性…我不太喜欢每种情况下的推理…想随时查看类型我完全理解,但在社区中确定一种编码风格是非常重要的,这样每个人都可以快速阅读其他人的代码,即使对于一种语言的新手来说感觉不对。但这在SO评论部分中没有什么需要解决的:)